PAT : 基础编程题目集_编程题答案(7-1 ~ 7-38)(纯C编写)

2023-10-31

题目地址
7-1

#include<stdio.h>
int main(int argc,char** argv)
{
  int cm;
  scanf("%d",&cm);
  float x=cm/0.3048/100;
  float a=(x-(int)x)*12.0;
  int b=(int)x;
  printf("%d %d\n",b,(int)a);
  return 0;
}

>>注意把厘米换成米
7-2

#include<stdio.h>
int main(int argc,char** argv)
{
  int a,b;
  scanf("%d%d",&a,&b);
  int hour1,hour2,min1,min2;
  hour1=a/100,hour2=b/60;
  min1=a%100,min2=b%60;
  int hour=hour1+hour2;
  int min=min1+min2;
  if(min>=60)
    hour++,min-=60;
  if(min<0)
    hour--,min+=60;
  printf("%d%02d\n",hour,min);
  return 0;
}

>>小坑,输出格式里说“输出四位数字表示的终止时间”,其实小时是个位时前面不用加0。
7-3

#include<stdio.h>
int main(int argc,char** argv)
{
  int num;
  scanf("%d",&num);
  while(!(num%10))
    num/=10;
  while(num)
  {
    printf("%d",num%10);
    num/=10;
  }
  printf("\n");
  return 0;
}


7-4

#include<stdio.h>
int main(int argc,char** argv)
{
  int num;
  scanf("%d",&num);
  int cnt=0,i=1;
  while(num)
  {
    cnt+=i*(num%16);
    i*=10;
    num/=16;
  }
  printf("%d\n",cnt);
  return 0;
}

>>题目翻译一下就是十进制转换成十六进制
7-5

#include<stdio.h>
int main(int argc,char** argv)
{
  printf("------------------------------------\n"
"Province      Area(km2)   Pop.(10K)\n"
"------------------------------------\n"
"Anhui         139600.00   6461.00\n"
"Beijing        16410.54   1180.70\n"
"Chongqing      82400.00   3144.23\n"
"Shanghai        6340.50   1360.26\n"
"Zhejiang      101800.00   4894.00\n"
"------------------------------------\n");
  return 0;
}


7-6

#include<stdio.h>
int main(int argc,char** argv)
{
  int num;
  char ch;
  float f1,f2;
  scanf("%f %d %c %f",&f1,&num,&ch,&f2);
  printf("%c %d %.2f %.2f",ch,num,f1,f2);
  return 0;
}


7-7

#include<stdio.h>
int main(int argc,char** argv)
{
  int hour,min;
  scanf("%d:%d",&hour,&min);
  if(hour<12)
    printf("%d:%d AM\n",hour,min);
  else if(hour==12)
    printf("12:%d PM\n",min);
  else
    printf("%d:%d PM\n",hour-12,min);
  return 0;
}


7-8

#include<stdio.h>
int main(int argc,char** argv)
{
  int speed;
  scanf("%d",&speed);
  if(speed>60)
    printf("Speed: %d - Speeding\n",speed);
  else
    printf("Speed: %d - OK\n",speed);
  return 0;
}


7-9

#include<stdio.h>
int main(int argc,char** argv)
{
  int A,B,C;
  scanf("%d %d %d",&A,&B,&C);
  if(A==B)
    printf("C\n");
  else if(B==C)
    printf("A\n");
  else
    printf("B\n");
  return 0;
}


7-10

#include<stdio.h>
int main(int argc,char** argv)
{
  int year,week;
  scanf("%d %d",&year,&week);
  int k=year<5?30:50;
  float sum=k*(week>40?40:week);
  sum+=(week>40?(week-40)*1.5*k:0);
  printf("%.2f\n",sum);
  return 0;
}


7-11

#include<stdio.h>
int main(int argc,char** argv)
{
  float x;
  scanf("%f",&x);
  float y=(x<=15?x*4/3:2.5*x-17.5);
  printf("%.2f\n",y);
  return 0;
}


7-12

#include<stdio.h>
int main(int argc,char** argv)
{
  int num1,num2;
  char sf;
  scanf("%d %c %d",&num1,&sf,&num2);
  int result;
  if(sf=='+')
    result=num1+num2;
  else if(sf=='-')
    result=num1-num2;
  else if(sf=='*')
    result=num1*num2;
  else if(sf=='/')
    result=num1/num2;
  else if(sf=='%')
    result=num1%num2;
  else
  {
    printf("ERROR\n");
    return 0;
  }
  printf("%d\n",result);
  return 0;
}


7-13

#include<stdio.h>
int main(int argc,char** argv)
{
  float num1,num2,num3,num4;
  scanf("%f%f%f%f",&num1,&num4,&num3,&num2);
  if(num2>num1)
    printf("R-Hollow");
  if(num2==num1)
    printf("R-Cross");
  if(num2<num1)
    printf("BW-Solid");
  if(num3<num1&&num3<num2)
  {
    printf(" with Lower Shadow");
    if(num4>num1&&num4>num2)
      printf(" and Upper Shadow");
  }
  else if(num4>num1&&num4>num2)
    printf(" with Upper Shadow");
  printf("\n");
  return 0;
}


7-14

#include<stdio.h>
int main(int argc,char** argv)
{
  int a,b;
  scanf("%d%d",&a,&b);
  int i=1,sum=0;
  while(a<=b)
  {
    sum+=a;
    printf("%5d",a++);
    if(!(i%5)&&a<=b)
      printf("\n");
    i++;
  }
  printf("\nSum = %d\n",sum);
  return 0;
}

>> i 计录已输出个数,每五个输出一次回车,其余输出空格。a>b则停止输出空格或回车。
7-15

#include<stdio.h>
int main(int argc,char** argv)
{
  double x;
  scanf("%lf",&x);
  double i=1,tip=1,j=1,sum=0;
  double a=1,tips=1;
  int col=0;
  while(i>=x)
  {
  	if(col)
    	tip*=j++;
    else
    	col++;
    tips*=a;
    a+=2;
    i=tip/tips;
    sum+=i;
  }
  printf("%.6lf\n",sum*2.0);
  return 0;
}

>>小坑:题目给的公式求出来是Pi/2,最后需要乘2。给定阈值是公式里最后一项<0.01。
7-16

#include<stdio.h>
int dig[4],book[5];
int k=0;
void func(int num,int now)
{
	if(now==4)
	{
		int i;
		for(i=1;i<=3;i++)
		{
			printf("%d",dig[i]);
		}
		k=(k+1)%6;
		if(k%6)
			putchar(' ');
		else
			putchar('\n');
		return;
	}
	int i;
	for(i=num;i<=num+3;i++)
	{
		if(!book[i])
		{
			book[i]++;
			dig[now]=i;
			func(num,now+1);
			book[i]=0;
		}
	}
}
int main(int argc,char** argv)
{
  int num;
  scanf("%d",&num);
  func(num,1);
  return 0;
}

>>DFS从小到大全排列,输出时只输出前三位。
7-17

#include<stdio.h>
int main(int argc,char** argv)
{
  int N,U,D;
  scanf("%d%d%d",&N,&U,&D);
  int floor=0,time=0;
  while(floor<N)
  {
    floor+=U,time++;
    if(floor>=N)
      break;
    floor-=D,time++;
  }
  printf("%d\n",time);
  return 0;
}

>>小学数学题……
7-18

#include<stdio.h>
int main(int argc,char** argv)
{
  	double a,b,c,d;
	scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
 	double x1,x2;
 	scanf("%lf%lf",&x1,&x2);
 	while(1)
 	{
 		double x=(x1+x2)/2.0;
 		double y=a*x*x*x+b*x*x+c*x+d;
 		double y1=a*x1*x1*x1+b*x1*x1+c*x1+d;
 		if(y==0||x2-x1<0.01)
 		{
 			printf("%.2lf\n",x);
 			break;
 		}
 		if(y*y1<0)
 			x2=x;
 		else
 			x1=x;
	}
  	return 0;
}

>>当前区间 x2-x1 小于0.01时不再计算。
7-19

#include<stdio.h>
int main(int argc,char** argv)
{
  int N;
	scanf("%d",&N);
 	int i;
  float Y;
  for(i=0;i<=99;i++)
  {
  	Y=(98.0*i-N)/199.0;
  	if(!(Y-(int)Y))
  		break;
 	}
  if(i==100)
		printf("No Solution\n");
	else
		printf("%d.%d\n",(int)Y,i);
	return 0;
}

>> y 元 f 分中的 f 肯定是0~99之间的,遍历一遍有没有对应的整数 y 。
7-20

#include<stdio.h>
int main(int argc,char** argv)
{
  	int N;
	scanf("%d",&N);
 	int i;
  	for(i=1;i<=N;i++)
  	{
  		int j;
  		for(j=1;j<=i;j++)
  			printf("%d*%d=%-4d",j,i,i*j);
  		printf("\n");
	}
  	return 0;
}


​​​​​​​7-21

#include<stdio.h>
#include<math.h>
int main(int argc,char** argv)
{
  	int N;
  	scanf("%d",&N);
  	int x=N/2,k=0;
  	double i,j;
  	for(i=1;i<=sqrt(x);i++)
  		for(j=i;j<sqrt(N);j++)
  			if(i*i+j*j==N)
  			{
  				printf("%.0lf %.0lf\n",i,j);
  				k++;
			}
	if(!k)
		printf("No Solution\n");
  	return 0;
}


​​​​​​​7-22

#include<stdio.h>
#include<math.h>
int main(int argc,char** argv)
{
  	int N;
  	scanf("%d",&N);
  	int wugui=0,tuzi=0;
  	int time,xtime=0;
	for(time=1;time<=N;time++)
	{
		if(!xtime)
			tuzi+=9;
		if(xtime)
			xtime--;
		if(time%10==0&&!xtime&&tuzi>wugui)
			xtime=30; 
		wugui+=3;
	}
	if(tuzi>wugui)
		printf("^_^ %d\n",tuzi);
	if(tuzi<wugui)
		printf("@_@ %d\n",wugui);
	if(tuzi==wugui)
		printf("-_- %d\n",tuzi);
  	return 0;
}

>>小学数学题……
​​​​​​​7-23

#include<stdio.h>
int main(int argc,char** argv)
{
  	int N;
  	scanf("%d",&N);
  	int fk1=0,fk2=0,fk3=0,fk4=0;
  	if(!N)
  		printf("a");
  	if(N/100000000)
  	{
  		putchar(N/100000000+'a');
  		putchar('Y');
  		N%=100000000;
  		fk3=1;
	}
	if(N/10000)
	{
		int M=N/10000;
		N%=10000;
		if(M/1000)
		{
			putchar(M/1000+'a');
  			putchar('Q');
  			M%=1000;
  			fk1=1;
  			fk3=0;
		}
		if(M/100)
		{
			if(fk3)
			{
				fk3=0;
				putchar('a');
			}
			putchar(M/100+'a');
  			putchar('B');
  			M%=100;
  			fk1=0;
  			fk2=1;
		}
		if(M/10)
		{
			if(fk1||fk3)
			{
				fk1=fk3=0;
				putchar('a');
			}
			putchar(M/10+'a');
  			putchar('S');
  			M%=10;
  			fk2=0;
		}
		if(M)
		{
			if(fk1||fk2||fk3)
			{
				fk3=0;
				putchar('a');
			}
			putchar(M+'a');
		}
		putchar('W');
		fk1=fk2=0,fk4=1;
	}
	if(N/1000)
	{
		if(fk3)
		{
			fk3=0;
			putchar('a');
		}
		putchar(N/1000+'a');
  		putchar('Q');
  		N%=1000;
  		fk1=1;
  		fk4=0;
	}
	if(N/100)
	{
		if(fk3||fk4)
		{
			fk3=fk4=0;
			putchar('a');
		}
		putchar(N/100+'a');
		putchar('B');
		N%=100;
		fk1=0;
		fk2=1;
	}
	if(N/10)
	{
		if(fk1||fk3||fk4)
		{
			fk1=fk3=fk4=0;
			putchar('a');
		}
		fk2=0;
		putchar(N/10+'a');
		putchar('S');
		N%=10;
	}
	if(N)
	{
		if(fk1||fk2||fk3||fk4)
			putchar('a');
		putchar(N+'a');
	}
	putchar('\n');
  	return 0;
}

疯狂判断法…2333。很麻烦的一道题,麻烦的地方在于零( a )在什么地方需要加。人民币大写规则转换参考这个网站,还能提供标准的输出答案。人民币大写在线转换工具

以下是关于零的几种情况:

100000001——bYab

110000001——bYbQWab

101000001——bYabBWab

11001——bWbQab

10101——bWabBab

1010001——bBabWab

0——a

全都考虑到就OK了,用笨办法从亿位到个位逐一确认是否不为0,前面高次位如果有数的话,标记一下,后面的紧挨的位也有数的话取消标记,否则就在第一个不是0的位前加零( a )。需要加以判断的标记位有

亿位——千万位取消标记,否则百万位到个位的第一个不为0的位前加a

千万位——百万位取消标记,否则十万位到万位的第一个不为0的位前加a

百万位——十万位取消标记,否则万位不为0的第的话前加a

万位——千万~万位有不为零的就标记,千位取消标记,否则百位到个位的第一个不为0的位前加a

千位——百位取消标记,否则十位到个位的第一个不为0的位前加a

百位——十位取消标记,否则个位不为0的第的话前加

方法看着很糟糕,本来以为没几个特殊条件的,就挨个判断好了,没想到这么多。直接把中间多个零当成一个零处理会简单得多…………笨办法仅供通过测试
7-24

#include<stdio.h>
int gcd(int a,int b)
{
	return a%b?gcd(b,a%b):b;
}
int main(int argc,char** argv)
{
  	int a,b;
  	scanf("%d/%d",&a,&b);
  	int c=gcd(a,b);
  	printf("%d/%d\n",a/c,b/c);
  	return 0;
}

>>辗转相除法求最大公因数
7-25

#include<stdio.h>
int main(int argc,char** argv)
{
  	int num;
  	scanf("%d",&num);
  	if(num<0)
  	{
  		num=-num;
  		printf("fu ");
	}
  	int dig[15]={0};
  	int i=1,j;
	while(num)
  	{
  		dig[i++]=num%10;
  		num/=10;
	}
	char str[11][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	if(i==1)
		printf("ling\n");
	for(j=i-1;j>=1;j--)
		printf("%s%c",str[dig[j]],j==1?'\n':' ');
  	return 0;
}

>>从最低位开始存储每一位的数字,读取完毕后从最高位的数字开始转换成对应的字符串输出。如果是负数前面加负号的字符串,如果没有进行存储则直接输出 0 对应的字符串。
7-26

#include<stdio.h>
int main(int argc,char** argv)
{
  char ch;
  int chlen=0,first=0;
  while(scanf("%c",&ch),ch!='.')
  {
  	if(ch!=' ')
  		chlen++;
  	else if(chlen)
  	{
  	  if(!first)
  	  {
  		  printf("%d",chlen);
  	    first=1;
  	  }
  	  else
  	    printf(" %d",chlen);
  		chlen=0;
		}
	}
	if(chlen)
	{
		if(!first)
		  printf("%d",chlen);
  	else
      printf(" %d",chlen);
	}
  return 0;
}

>>不是空格或点就计数,遇到空格或点就输出当前计数并清零。
7-27

#include<stdio.h>
int main(int argc,char** argv)
{
  	int N,K;
  	scanf("%d%d",&N,&K);
  	int i,j,dig[105];
  	for(i=1;i<=N;i++)
  		scanf("%d",&dig[i]);
  	for(i=0;i<K;i++)
  		for(j=1;j<=N-1-i;j++)
  			if(dig[j]>dig[j+1])
  			{
  				dig[j+1]+=dig[j];
  				dig[j]=dig[j+1]-dig[j];
  				dig[j+1]-=dig[j];
			}
	for(i=1;i<=N;i++)
		printf("%d%c",dig[i],i==N?'\n':' ');
  		
  	return 0;
}

>>标准冒泡排序,调整排序次数为 K 次。
7-28

#include<stdio.h>
int main(int argc,char* argv[])
{
    int m;
    scanf("%d",&m);
    int s=0;
    for(int i=2;i<=m;i++)
        s=(s+3)%i;
    printf("%d\n",s+1);
    return 0;
}

>>约瑟夫问题,可以用数组模拟的方法,也可以数学推导后递归公式求解。

详见我得另一篇文章 模拟/递归:约瑟夫问题
7-29

#include<stdio.h>
#include<string.h>
char str1[1005];
char str2[1005];
int main(int argc,char** argv)
{
  	scanf("%[^\n]%*c",str1);
  	scanf("%[^\n]%*c",str2);
  	char *point;
  	int mlen=strlen(str1);
  	int slen=strlen(str2);
  	while(point=strstr(str1,str2),point!=NULL)
  	{
  		while(point!=str1+mlen)
  		{
  			*point=*(point+slen);
  			point++;
		}
	}
	printf("%s\n",str1);
  	return 0;
}

>>字符串函数应用,strlen求得两串长度,strstr在母串找字串,找到后从指针处到母串结尾向前移动。
7-30

#include<stdio.h>
#include<string.h>
int main(int argc,char** argv)
{
  	int N,K;
  	scanf("%d%d",&N,&K);
  	int i,j,book[105];
  	for(i=1;i<=N;i++)
  		book[i]=i;
  	char dig[105][15];
  	for(i=1;i<=N;i++)
  		scanf("%s",dig[i]);
  	for(i=0;i<K;i++)
  		for(j=1;j<=N-1-i;j++)
  			if(strcmp(dig[book[j]],dig[book[j+1]])>0)
  			{
  				int keep=book[j];
  				book[j]=book[j+1];
  				book[j+1]=keep;
			}
	for(i=1;i<=N;i++)
		printf("%s\n",dig[book[i]]);
  	return 0;
}

>>用strcmp对两串比较作为排序依据,用数组存储排序后的各串顺序,依次输出。

也可以每次比较都进行三次字符串复制( strcpy ),不过要慢许多。
7-31

#include<stdio.h>
#include<string.h>
int main(int argc,char** argv)
{
  	char str[105];
  	scanf("%[^\n]",str);
  	int ind,ins=strlen(str);
	scanf("%d",&ind);
	ind%=ins;
	int i,j;
	for(i=1;i<=ins;i++)
	{
		ind%=ins;
		printf("%c",str[ind++]);
	}
  	return 0;
}

>>每次递增下标 ind 时都进行取余运算,以达到循环输出的目的。
7-32

#include<stdio.h>
#include<string.h>
char str[500005];
int book[500005][2];
int main(int argc,char** argv)
{
  	scanf("%[^\n]",str);
  	int ind,ins=strlen(str),con=0,booknow=0;
	for(ind=0;ind<ins;ind++)
	{
		if(str[ind]!=' '&&!con)
		{
			con=1;
			book[booknow][0]=ind;
		}
		else if(str[ind]==' '&&con)
		{
			con=0;
			book[booknow++][1]=ind;
		}
	}
	if(con)
		book[booknow++][1]=ins;
	for(ind=booknow-1;ind>=0;ind--)
	{
		for(ins=book[ind][0];ins<book[ind][1];ins++)
			printf("%c",str[ins]);
		printf("%c",ind==0?'\n':' ');
	}
  	return 0;
}

>>三种基本反转字符串的一种,分析发现这种交换并不改变字符串的输出方向,也就是说都是从左向右输出,只不过输出的起始和终止位置改变了,而且不断的在串内改变起始和终止位置,由此可知一种很简单的方法是扫描一遍原串,用二维数组存储下每个单词的起始位置和终止位置。后从最后一个单词开始不断输出原串中的单词。

速度优于交换字符串后输出的方法。
7-33

#include<stdio.h>
int gcd(int m,int n)
{
	return m%n?gcd(n,m%n):n;
}
int main(int argc,char** argv)
{
	int a1,a2,b1,b2;
	scanf("%d/%d %d/%d",&a1,&a2,&b1,&b2);
	int lcm=a2*b2/gcd(a2,b2);
	int sum=lcm/a2*a1+lcm/b2*b1;
	int pr=lcm/gcd(lcm,sum);
	if(pr==1)
	  printf("%d\n",sum/gcd(lcm,sum));
	else
	  printf("%d/%d\n",sum/gcd(lcm,sum),pr);
	return 0;
}

>>gcd递归函数求取最大公因数,通分后相加后化简即可。
7-34

#include<stdio.h>
char array[20][5][20];
int main(int argc,char** argv)
{
	int num,i,j;
	scanf("%d",&num);
	for(i=0;i<num;i++)
		scanf("%s%s%s%s%s",array[i][0],array[i][4],array[i][3],array[i][1],array[i][2]);
	scanf("%d",&i);
	while(i--)
	{
		scanf("%d",&j);
		if(j>=num||j<0)
			printf("Not Found\n");
		else
			printf("%s %s %s %s %s\n",array[j][0],array[j][1],array[j][2],array[j][3],array[j][4]);
	}
	return 0;
}

>>三维数组直存直取,注意 j 可能是负数。
7-35

#include<stdio.h>
int gcd(int m,int n)
{
	return m%n?gcd(n,m%n):n;
}
void fk(int *m,int *n)
{
	int spgcd=gcd(*m,*n);
	*m/=spgcd;
	*n/=spgcd;
	return;
}
int main(int argc,char** argv)
{
	int ind;
	scanf("%d",&ind);
	int a1=0,a2=1,i;
	for(i=1;i<=ind;i++)
	{
		int b1,b2;
		scanf("%d/%d",&b1,&b2);
		a1=a1*b2+b1*a2;
		a2*=b2;
		fk(&a1,&a2);
	}
	a2*=ind;
	fk(&a1,&a2);
	if(a2==1)
		printf("%d\n",a1);
	else if(a1==0)
	  printf("0\n");
	else
		printf("%d/%d\n",a1,a2);
	return 0;
}

>> fk 函数基于 gcd 函数对输入的分子分母化简,初始化当前分数和为 0/1 ,输入一个分数进行一次通分相加及约分化简,分母乘以除数后化简输出结果。
7-36

#include<stdio.h>
void print(double m,double n)
{
	if(!(m<0.05&&m>-0.05))
	{
		printf("%.1lf",m);
		if(!(n<0.05&&n>-0.05))
			printf("%+.1lfi",n);
	}
	else if(!(n<0.05&&n>-0.05))
		printf("%.1lfi",n);
	if((m<0.05&&m>-0.05)&&(n<0.05&&n>-0.05))
		printf("0.0");
	printf("\n");
}
int main(int argc,char** argv)
{
	double x1,x2,x3,x4,sp1,sp2,sp3;
	scanf("%lf%lf%lf%lf",&x1,&x2,&x3,&x4);
	printf("(%.1lf%+.1lfi) + (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
	print(x1+x3,x2+x4);
	printf("(%.1lf%+.1lfi) - (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
	print(x1-x3,x2-x4);
	printf("(%.1lf%+.1lfi) * (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
	sp1=x1*x3-x2*x4;
	sp2=x1*x4+x2*x3;
	print(sp1,sp2);
	printf("(%.1lf%+.1lfi) / (%.1lf%+.1lfi) = ",x1,x2,x3,x4);
	sp3=x3*x3+x4*x4;
	sp1=(x1*x3+x2*x4)/sp3;
	sp2=(-x1*x4+x2*x3)/sp3;
	print(sp1,sp2);
	return 0;
}

>>此题对格式要求严格,前面的 a1、a2、b1、b2 四舍五入保留一位小数,虚数须输出正号。

四个运算结果需要判断是否为 0 ,这个判断是对于四舍五入一位小数后的,(-0.05,0.05) 区间认为是 0 。
7-37

#include<stdio.h>
int book[35];
int nowsum,cnt,ind;
void dfs(int sum,int m)
{
	int i;
	if(sum==nowsum)
	{
		printf("%d=%d",sum,book[1]);
        for(i=2;i<ind;i++)
			printf("+%d",book[i]);
        if(ind==2||cnt%4==0)
    		putchar('\n');
        else
			putchar(';');
		cnt++;
        return;
	}
	for(i=m;i<=sum-nowsum;i++)
	{
		nowsum+=i;
		book[ind++]=i;
		dfs(sum,i);
		ind--;
		nowsum-=i;
	}
}
int main(int argc,char** argv)
{
	int sum;
	ind=cnt=1;
	scanf("%d",&sum);
	dfs(sum,1);
	return 0;
}

>>DFS。
7-38

#include<stdio.h>
int dig[100005];
int main(int argc,char** argv)
{
	int num,x,sum=0;
	scanf("%d%d",&num,&x);
	int i,ind=x;
	for(i=1;i<=x;i++)
	{
		sum+=num*(ind--);
		dig[i]=sum%10;
		sum/=10;
	}
	if(sum||!x)
		printf("%d",sum);
	for(i=x;i>=1;i--)
		printf("%d",dig[i]);
	return 0;
}

>>乍一看是个大数加法题,其实参与加法的每一位都是相同数字,就可以通过乘法来计算。

想象下把所有需要相加的数列在一起,个位就是数字乘以数的个数。

如:输入>>1 5 ,计算1+11+111+1111+11111,个位就是1*5,处理进位后是( 1*5 )%10,十位是1*4+来自个位的进位,以此递推。

最后需要先输出的是来自最高位的进位,后从高位依次输出,注意不要忘记 0 的特殊情况。

END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PAT : 基础编程题目集_编程题答案(7-1 ~ 7-38)(纯C编写) 的相关文章

  • PAT乙级题解1016——1016 部分A+B(Java)

    PAT乙级题解1016 1016 部分A 43 B xff08 Java xff09 一 xff1a 题目 二 xff1a 输入输出 输入样例 xff1a span class token number 3862767 span span
  • 7-10 链表去重(25 分)

    给定一个带整数键值的链表 L 你需要把其中绝对值重复的键值结点删掉 即对每个键值 K 只有第一个绝对值等于 K 的结点被保留 同时 所有被删除的结点须被保存在另一个链表上 例如给定 L 为 21 15 15 7 15 你需要输出去重后的链表
  • PAT乙级1037 在霍格沃茨找零钱 (20分)

    pragma warning disable 4996 include
  • B1094 谷歌的招聘 (20 分)

    2004 年 7 月 谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌 如下图 用于招聘 内容超级简单 就是一个以 com 结尾的网址 而前面的网址是一个 10 位素数 这个素数是自然常数 e 中最早出现的 10 位连续数字 能找出这个
  • 【PAT】1033 旧键盘打字 (20 分)

    1033 旧键盘打字 20 分 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中
  • 1004 成绩排名 (20 分) Java写法 读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

    读入 n gt 0 名学生的姓名 学号 成绩 分别输出成绩最高和成绩最低学生的姓名和学号 输入格式 每个测试输入包含 1 个测试用例 格式为 第 1 行 正整数 n 第 2 行 第 1 个学生的姓名 学号 成绩 第 3 行 第 2 个学生的
  • 1014 Waiting in Line (30)

    题目描述 Suppose a bank has N windows open for service There is a yellow line in front of the windows which devides the wait
  • PAT题解——Basic Level——1094 谷歌的招聘

    题目链接 https pintia cn problem sets 994805260223102976 problems 1071785997033074688 题面 本题要求你编程解决一个更通用的问题 从任一给定的长度为 L 的数字中
  • PAT 1033 旧键盘打字

    题目链接 请点击 思路 用string定义两个字符串 然后比较就可以了 然而 开始直接用cin gt gt str1 gt gt str2 导致有部分测试点始终未过去 后来参考他人的博客才发现这里应该用getline原因就在于第一行可能是空
  • PAT 1103 Integer Factorization

    题目的意思是给定n k p 求是否存在k个正整数 每个数的p次幂相加的结果等于n 有 输出k个数相加的结果最大的那个 如果有多个 输出序列从大到小排最大的那个 从左往右比较 若 i lt l a i
  • PAT : PAT (Basic Level) Practice(中文)答案(1001 ~ 1095)(纯C编写)

    题目集地址 报名了12月的PAT B 先试试水 已完成 2018 10 22 2018 11 14 更新 2018 12 09 PAT乙级考试100分 考试代码已更新 冬天坐火车跑去考试冻懵了 来年对战PAT甲级考试 目录 目录 题目集地址
  • 【PAT甲级A1125】 Chain the Ropes (25分)(c++)

    1125 Chain the Ropes 25分 作者 CHEN Yue 单位 浙江大学 代码长度限制 16 KB 时间限制 200 ms 内存限制 64 MB Given some segments of rope you are sup
  • 1033 旧键盘打字 (20分)

    这道题很坑的一点就是 有可能坏掉的键盘是空串 所有的键都是好的 如下测试用例 input NULL abcdefg output abcdefg 所以 用字符串数组的不能直接用scanf s str 读入 用string的也不能直接用cin
  • PAT A1123 2019.09.05 【AVL建树 层序判断完全二叉树】

    1123 Is It a Complete AVL Tree 30 分 An AVL tree is a self balancing binary search tree In an AVL tree the heights of the
  • 7-3 谁是赢家

    7 3 谁是赢家 某电视台的娱乐节目有个表演评审环节 每次安排两位艺人表演 他们的胜负由观众投票和 3 名评委投票两部分共同决定 规则为 如果一位艺人的观众票数高 且得到至少 1 名评委的认可 该艺人就胜出 或艺人的观众票数低 但得到全部评
  • 1032. 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强 PAT组织了一场挖掘机技能大赛 现请你根据比赛结果统计出技术最强的那个学校 输入格式 输入在第1行给出不超过105的正整数N 即参赛人数 随后N行 每行给出一位参赛者的信息和成绩 包括其所代表的学校的编号
  • 1007. 素数对猜想 (20)

    让我们定义 dn 为 dn pn 1 pn 其中 pi 是第i个素数 显然有 d1 1 且对于n gt 1有 dn 是偶数 素数对 猜想 认为 存在无穷多对相邻且差为2的素数 现给定任意正整数N lt 105 请计算不超过N的满足猜想的素数
  • 1001 害死人不偿命的(3n+1)猜想 (15 分)

    1001 害死人不偿命的 3n 1 猜想 15 分 卡拉兹 Callatz 猜想 对任何一个正整数 n 如果它是偶数 那么把它砍掉一半 如果它是奇数 那么把 3n 1 砍掉一半 这样一直反复砍下去 最后一定在某一步得到 n 1 卡拉兹在 1
  • 8-0. 查找整数(10)

    本题要求从输入的N个整数中查找给定的X 如果找到 输出X的位置 从0开始数 如果没有找到 输出 Not Found 输入格式 输入在第1行中给出2个正整数N lt 20 和X 第2行给出N个整数 数字均不超过长整型 其间以空格分隔 输出格式
  • ts 流基础(白话讲解).

    author hjjdebug date 2022年 09月 27日 星期二 ts 流就是188个字节构成的流数据 先来点最简单的 ts 头部 4字节 ts 流是47开头的 以188字节为单位的打包流 由4字节包头及包体构成 4字节第一个4

随机推荐

  • html中写接口调用数据,jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例...

    本文实例讲述了jQuery Ajax js实现请求json格式数据并渲染到html页面操作 分享给大家供大家参考 具体如下 1 先给json格式的数据 id 1 name stan id 2 name jack id 3 name lucy
  • 合宙Air105

    扩展阅读 合宙Air105 fatfs io操作 扩展 SPI 可调功放 I2C SPI toHex os remove LuatOS SOC接口 官方demo 学习 15 1 fatfs文件系统 打酱油的工程师的博客 CSDN博客 合宙A
  • Uformer: A General U-Shaped Transformer for Image Restoration阅读笔记

    Abstract 构建一个分层的编码 解码器 并使用Transformer block进行图像恢复 Uformer两个核心设计 1 local enhanced window Transformer block 使用非重叠窗口自注意力降低计
  • js 密码正则表达式(至少8位且必有数字+特殊字符+字母)

    正则 var reg A Za z d lt gt A Za z d lt gt 8 可用 test 方法验证 reg test value 参考 js正则验证特殊字符 summer7310 博客园 正则表达式 密码必须至少包含八个字符 至
  • 《人工智能》知识总结

    知识图谱表示法 1 知识图谱主要用于智能搜索 智能问答 个性化推荐 多维导航 内容分发等领域 2 语义网络更侧重于表示概念与概念之间的关系 知识图谱更侧重于表示实体与实体之间的关系 3 已有图谱作用于实体 发现 扩充新的知识图谱 4 知识图
  • Map之TreeMap

    我们先不谈TreeMap我们来直接聊聊HashMap 首先当我们用HashMap存储数据的时候 我们要如何将给出的数据排序呢 这是一个问题 那么TreeMap本身是支持排序的 是对key进行的排序 但是需要用户定义 实现排序 主要有两种方法
  • 使用智星云stable diffusion创建ai创意绘画

    目录 租赁选择 控制台 参数选择 下载图片 结束租用 租赁选择 选择完以后 下面会列出可用的显卡型号 选择对应需要的就可以 2080ti 1080ti都能跑 只不过显存越大的卡 能画的图越大 速度也越快 点击租用 用默认值即可 然后创建实例
  • 弱电人要学习的网络安全基础知识

    提到网络安全 一般人们将它看作是信息安全的一个分支 信息安全是更加广义的一个概念 防止对知识 事实 数据或能力非授权使用 误用 篡改或拒绝使用所采取的措施 说白了 信息安全就是保护敏感重要的信息不被非法访问获取 以及用来进 步做非法的事情
  • html搜索区域选择框,带搜索过滤功能的jQuery国家地区选择下拉框插件

    nicecountryinput js是一款带搜索过滤功能的jQuery国家地区选择下拉框插件 该下拉框插件通过简单的代码就可以实现所有国家和地区的选择下拉框 并且可以通过搜索框对国家地区名称进行搜索 使用方法 在页面中引入jquery m
  • ENVI 混合像元分解

    一 混合像元分解的过程 在影像已经完成预处理的前提下 如几何校正 大气校正 去噪等 混合像元分解的一般的过程 首先获取端元波谱 从图像上 波谱库中或者其他来源 然后选择一种分解模型在每个像素中获取每个端元波谱的相对丰度图 最后从丰度图上提取
  • 3. Flutter——HTTP请求

    dio数据请求 HTTP 添加依赖 dependencies dio 1 0 9 版本 get 请求 import package dio dio dart Dio dio new Dio var response await dio ge
  • Vue-element-admin在左上角添加LOGO的方法

    本文主要是分享一下思路的 如不想看可以直接跳到最后 做项目时有一个在左上角添加logo的需求 但是element admin貌似没有添加logo的位置 于是我先在页面中检查侧边栏 发现它是sidebar container类 于是我在vsc
  • eclipse中使用log4j2在控制台输出彩色日志

    目录 一 eclipse中安装Ansi Console 二 在log4j2配置文件中配置颜色样式 三 在log4j2 component properties 配置文件中启用颜色配置 四 附上log4j2配置文件 1 log4j2 xml
  • left join 连表问题解析:on后多条件无效 & where与on的区别

    在项目中用到多表联合查询 发现2个现象 今天解决这2个疑问 1 left join连接2张表 on后的条件第一个生效 用and连接的其他条件不生效 2 一旦加上where 则显示的结果等同于inner join 先写结论 过滤条件放在 wh
  • 停止一下或多个进程以继续安装 vmware-vmx.exe 问题解决

    1 起因 用vmware大虚拟机做大数据集群经常出现某个虚拟机起不来 还导致vmware无法关闭 提示某某虚拟机繁忙 经网友提示 升级到15 pro可以解决 事实证明无效 最后的解决办法是手动复制虚拟机文件 在配置文件中注释uid 然后用虚
  • Java中的多态调用问题,下面代码输出是什么?

    转自 http www lvhongqiang com blog431 html 问题 下面代码输出是什么 public class Test3 public static void main String args AAA a new B
  • Spring Boot项目中使用Logback日志与使用AOP拦截请求日志信息

    日志记录了系统行为的时间 地点等很多细节的具体信息 在发生错误或者接近某种危险状态时能够及时提醒开发人员处理 往往在系统产生问题时承担问题定位与诊断和解决的重要角色 一般很多线上的问题只能通过进行日志分析才可以解决的 所以需要明确日志在日常
  • 【Android开发,极客时间资源共享

    android divider f00 分割线的颜色 android dividerHeight 2dp 分割条的高度 android cacheColorHint 0fff 当列表使用背景图之后 下拉或者上拉都会出现一个问题 背景图不见了
  • 针对热点数据的处理

    针对热点数据的处理 出现问题 解决办法 大体思路 实现方式一 Spring Data Redis 前言 项目要求 Redis中菜品缓存数据KEY的设计 dish 分类id 一 导入依赖 二 添加缓存的代码例子 三 删除缓存 实现方式二 Sp
  • PAT : 基础编程题目集_编程题答案(7-1 ~ 7-38)(纯C编写)

    题目地址 7 1 include