十五題解題細節
1···簡要題意:輸入一個百分制的成績T,並將其轉化成對應的等級。
思路:根據題目要求分為六個區間,依次輸入和輸出
細節:注意到是多組資料需要用while(scanf("%d",&n)!=EOF)語句,(n>=90&&n<=100)而不是(90<=n<=100)還有就是”A”
原始碼 : #include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
if(n>=90&&n<=100)
cout<<"A"<<endl;
if(n>=80&&n<90)
cout<<"B"<<endl;
if(n>=70&&n<80)
cout<<"C"<<endl;
if(n>=60&&n<70)
cout<<"D"<<endl;
if(n>=0&&n<60)
cout<<"E"<<endl;
if(n>=101||n<0)
cout<<"Score is error!"<<endl;
}
return 0;
}
}2~~~簡要題意:“水仙花數”是一個三位數,輸入兩個整數。還有就是水仙花的個數,如果在給定的區間記憶體在水仙花數,那麼就需要從小到大排序;如果不存在水仙花數就輸出no.
思路:據題目要求輸入兩個整數,水仙花數計數清零。計算水仙花數,判斷他是水仙花數。在這個環境下,分析水仙花數的個數。
細節:s[1000]通常裡面的數字要稍微取得大一點,注意到水仙花數是從m開始取得。並且別忘了輸出空格以及乘號。
原始碼:#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int m,n;
while(cin>>m>>n)
{
int x=0;
int s[1000];
for(int i=m;i<=n;i++)
{
int a, b, c;
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
{
s[x]=i;
x++;
}
}
if(x==0) cout<<"no"<<endl;
else
{
for(int j=0;j<x;j++)
{
cout << s[j];
if(j<x-1) cout<<" ";
}
cout<<endl;
}
}
return 0;
}
3····簡要題意:給定n個數據求所有奇數的乘積。輸入多組資料,並且假定每組資料至少含有一個奇數。
思路:輸入n,輸入多組資料,確定初值奇數。
細節:初值為1,for迴圈中輸入奇數。
原始碼:#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int n,i;
int a;
while(cin>>n)
{
int b=1;
for(i=1;i<=n;i++)
{
cin>>a;
if(a%2!=0)
b=b*a;
}
cout<<b<<endl;
}
return 0;
}
4···簡要題意:求多項式的和。
思路:輸入m組資料,前n項所以n分為奇數和偶數,輸入i個數據j個數。
細節:注意到for(int i=1;i<=m;i++)運用了兩次。等號==而不是=。
原始碼:#include<cstdio>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
int m,a[1000];
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
double s=0;
for(int j=1;j<=a[i];j++)
{
if(j%2==1) s=s+(double)1/j;
if(j%2==0) s=s-(double)1/j;
}
printf("%.2lf\n",s);
}
return 0;
}
5····簡要題意:輸入兩個正整數,且每隔一個整數輸出其平均值,最後不足這個固定整數的數按其實際數求其平均值並且輸出。
思路:輸入兩個整數,定義求和,賦初始值,間隔是在增加的,判斷間隔與m之間的關係。輸出各個平均值。
細節:注意到num==m以及num=0,i<n*2,
原始碼:#include<stdio.h>
int main()
{
int n,m,i,sum,num;
while(scanf("%d %d",&n,&m)!=EOF)
{
num=0,sum=0;
for(i=2;i<=2*n;i+=2)
{
sum+=i;
num++;
if(num==m&&(i!=n*2))
{
printf("%d ",sum/num);
num-=m;
sum=0;
}
}
if(sum==0&&num==0) continue;
printf("%d\n",sum/num);
}
}
6```簡要題意:輸入一個十進位制的數,並把它轉化為R進位制輸出。
思路:分n大於零,n等於零,以及n小於零三種情況,並且弄清楚十進位制轉化成R進位制一般是除以R.
細節:別忘了對零以及負數的單獨判斷,負數先轉化成正數。對於0則直接輸出0。
原始碼#include<stdio.h>
int main()
{
long n;
int a[1000],b,i,j,r;
while (scanf("%ld%d",&n,&r)!=EOF)
{
i=0;
if(n<0){n=-n;printf("-");}
if(n==0)
printf("0");
while(n>0)
{
b=n%r;
a[i++]=b;
n=n/r;
}
i=i-1;
for(j=i;j>=0;j--)
{
switch(a[j])
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default :printf("%d",a[j]);
}
}
printf("\n");
}
return 0;
}:
7–簡要題意:輸入多組資料判斷該組資料是否是迴文串。
思路:注意每次迴圈必須初始化,令c=0,strlen(a)表示字串的長度,然後把字元陣列a的內容倒序賦值給b,最後計算a,b中相等的個數,如果所有元素都相等則說明a中元素倒序排列後任相等。
細節:定義字串的標頭檔案為#include<cstring>,最後要換行輸出。
原始碼:#include<stdio.h>
#include<string.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,length,count;
char a[1000],b[1000];
while(n--)
{
count=0;
scanf("%s",a);
length=strlen(a);
for(i=0;i<length;i++)
b[i]=a[length-1-i];
for(i=0;i<length;i++)
if (b[i]==a[i])
count++;
if(count==length)
printf("yes\n");
else printf("no\n");
}
}
return 0;
}
8-簡要題意:猴子在接下來的每一天都吃該天內總桃子數的一半加一個,並且在第n天時還剩一個桃子。
思路:用逆推的思維既下一天的桃子數加一乘以二是前一天所剩的桃子數。:
細節:注意考慮到當n小於1並且n大於30時的情況。
原始碼:#include <stdio.h>
int main()
{
int n,sum=1,i;
while( scanf("%d",&n)!=EOF)
{
if( n<=1 || n>=30 )
break;
else
{
sum=1;
for( i=n; i>1; i-- )
{
sum = (sum+1)*2;
}
}
printf("%d\n",sum);
}
}
9-簡要題意:輸入若干組資料,每組資料包含兩個整數,其中一個整數的末尾兩位是未知的,但是該整數可以被另一個整數除盡。輸出末尾的兩數。
思路:先輸入輸出特殊的情況,
細節:if((c+i)%b==0)
原始碼:#include<stdio.h>
main()
{
int a,b,j,i,k,c,s[100];
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a==0&&b==0)
break;
j=0;
c=a*100;
for(i=0;i<100;i++)
if((c+i)%b==0)
{
s[j]=i;
j++;
}
for(k=0;k<j-1;k++)
printf("%.2d ",s[k]);
printf("%.2d\n",s[k]);
}
return 0;
}
10-簡要題意:輸入一些數值不超過10000,個數不超過50的正數,把一個偶數拆成兩個不同的素數之和。輸出拆法的個數。
思路:輸入n,定義i,j
細節:if(a[i]+a[n–i]=n)
原始碼:#include<stdio.h>
int main()
{
int a[10000],n,i,j,m;
for(i=3;i<=10000;i++)
{
a[i]=i;
}
for(i=2;i<=10000;i++)
{
for(j=2*i;j<=10000;j+=i)
{
a[j]=0;}}
while(scanf("%d",&n)!=EOF&&n)
{
m=0;
for(i=3;2*i<n;i++)
if(a[i]+a[n-i]==n)
++m;
printf("%d\n",m);
}
}
11-簡要題意:輸入m行資料,每行資料包含兩個整數。判斷輸入的數是否為親和數。
思路:輸入m以及兩個整數,根據題意描述判斷兩個數是否為親和數。
細節:定義sum(a)
if(sum(a)==b)
原始碼:#include<stdio.h>
int sum(int number)
{
int i;
int sum=0;
for(i=1;i<number;i++)
{
if(number%i==0)
sum=sum+i;
}
return sum;
}
int main()
{
int i,a,b,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
sum(a);
if(sum(a)==b)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
12-簡要題意:輸入多組包括菜種、單價和數量這三方面的資料,輸出精度為1的所需支付花費的金額。
思路:根據題意定義資料,運用多組輸入和數學計算求出值並輸出。
細節:定義菜種但不計算,定義初始支付金額為0。
原始碼:#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string c;
double a,b,sum;
sum=0;
while(cin>>c>>a>>b)
{
sum+=(a*b);
}
printf("%.1lf\n",sum);
return 0;
}
13-簡要題意:輸入一個長為11位的手機號碼,把他轉化成一個以6開頭的短號碼輸出。
思路:按要求輸入多組資料,定義字元,資料。
細節:scanf("%s",m)
printf("6%s\n",m+6)
原始碼:#include<stdio.h>
int main()
{
int n;
int i;
char m[12];
scanf("%d",&n);
while(n--)
{
scanf("%s",m);
printf("6%s\n",m+6);
}
return 0;
}
14-簡要題意:把一個數x插入到從小到大排列好的n個整數中,使新的數列仍然有序。
思路:把m插入到數列中,若m小於它前面的數,則把m和它前面的數交換。既if(a[i]>m) {l=a[i]; a[i]=m; m=l}
細節:最後要換行輸出,輸入時輸入多組資料。
原始碼:#include <stdio.h>
int main()
{
int n, x, a[100], i, j;
while(scanf("%d%d",&n,&x)&&(n||x))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
if(x<a[i])
break;
}
for(j=0;j<i;j++)
printf("%d ",a[j]);
printf("%d",x);
for(j=i;j<n;j++)
printf(" %d",a[j]);
printf("\n");
}
return 0;
}
15-簡要題意:有一個m階的樓梯,剛開始在第一級,若每次只能跨一級或兩級,要走上第m級,求共有多少種方法。
思路:由於一開始就站在第一級上,故上第一級需要0步,上第二級需要一種走法,上第三級需要兩種方法,當級數大於等於四級的時候可找到規律:a[i]=a[i–1]+a[i–2].
細節:輸出換行,級數要小於M.
原始碼:#include<stdio.h>
int main()
{
int N=0,M=0,i=0,sum=0,a[41]={0};
scanf("%d",&N);
a[1]=1;
a[2]=1;
for(i=3;i<=40;i++)
a[i]=a[i-1]+a[i-2];
while(N--)
{
scanf("%d",&M);
printf("%d\n",a[M]);
}
return 1;
}
收穫總結:
1、輸入多組資料while(cin>>n)
2、斷層求解找準範圍,一般輸入較大一點的資料範圍。求解百位、十位以及個位的數是最後用求餘的方法可能會更好。
3、數的幾次方可以轉化為幾個數的相乘,而且不要忘了乘號不能省略。
4、要注意賦初值的情況,還有要討論奇偶性的問題。
5、一般有特殊的情況的可以先考慮輸入輸出。
6、scanf()函式中,可用%md指定讀取位數。