1. 程式人生 > >演算法競賽入門經典(第二版)第二章迴圈結構程式設計註解與習題下

演算法競賽入門經典(第二版)第二章迴圈結構程式設計註解與習題下

2-4子序列的和

輸入兩個正整數n<m<10^6,輸出1/ n^2+1/ (n+1)^2+……+1/ m^2,保留5位小數。輸入包含多組資料,結束標記為n=m=0.提示:本題有陷阱
本題思路在於乘法溢位的問題
陷阱就是關於int型別的極限,因為Int的上限是2^32-1

#include <stdio.h>
int main()
{
           int n,m;
           double a;
           while(scanf("%d%d",&n,&m)!=EOF&&n&&
m) { a=0.0; for(long long i=n;i<=m;i++)//若變為int型別則,會有乘法溢位的問題 { double b=i*i; a+=1/b; } printf("%.5f\n",a); } }

2.5 分數化小數

輸入正整數a,b,c,輸出a/b的小數形式,精確到小數點後c位。a,b<=10^6,c<=100.輸入包含多組資料,結束標記位a=b=c=0

#include<stdio.h>
int main()
{
    int a,b;
    int c,i;
    while(scanf("%d %d%d",&a,&b,&c)!=EOF&&a,b,c)
    {
    int d[110];//小數點後面數字用陣列表示出來
    d[0]=0;
    for(i=1;i<=c;i++)
    {
        int e=a*10/b;
        d[i]=e%10;
        a=a*10;
    }
    d[i]='\0';
    if(d[i-1]
>=5) d[i-1]+=1; printf("0."); for(i=1;d[i]!='\0';i++) { printf("%d",d[i]); } printf("\n"); } }

2.6 排列

用1,2,3,……9組成3個三位數 abc,def和ghi,每個數字恰好使用一次,要求abc:def:ghi=1:2:3。
按照”abc def ghi”的格式輸出所有解,每行一個解。
思路:1:2:3可以說明假設用一個最小的三位數就可以表示出其他的二個數,然後就是最小的三位數是123,它的最大值是987/3得到329
還有就是判斷是否每個數字只使用了一次

#include <stdio.h>
int main() {
	int a,b,c,d,e,f,g,h,i,j,k,l,m,o;
	for(int a=123;a<=329;a++)
	{
	    int n=0;
	    b=a;
	    c=b/100;
	    d=b/10%10;
	    e=b%10;
	    f=b*2;
	    g=f/100;
	    h=f/10%10;
	    i=f%10;
	    j=b*3;
	    k=j/100;
	    l=j/10%10;
	    m=j%10;
       for(o=1;o<=9;o++)
       {
         if(c==o)n++;
         else if(d==o) n++;
         else if(e==o) n++;
         else if(g==o) n++;
         else if(h==o) n++;
         else if(i==o) n++;
         else if(m==o) n++;
         else if(k==o) n++;
         else if(l==o) n++;
	   }
       if(n==9)
        printf("%d\t%d\t%d\n",b,f,j);
}
}