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

题目地址
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

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/81391393