1. 程式人生 > >PAT : 基礎程式設計題目集_程式設計題答案(7-1 ~ 7-38)(純C編寫)

PAT : 基礎程式設計題目集_程式設計題答案(7-1 ~ 7-38)(純C編寫)

題目地址
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;
}

>>約瑟夫問題,可以用陣列模擬的方法,也可以數學推導後遞迴公式求解。

#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