1. 數字之和
源代碼:
#include <stdio.h>int main(){ int n,pown; int sum1,sum2; while(scanf("%d",&n)!=EOF) { if(n==0) break; pown=n*n; sum1=0,sum2=0; while(n) { sum1+=n%10; n/=10; } while(pown) { sum2+=pown%10; pown/=10; } PRintf("%d %d/n",sum1,sum2); } return 0;}程序截圖:
2. 字符串的反碼
源代碼:
#include <stdio.h>#include <string.h>#define maxlen 81int main(){ int i; char str[maxlen]; while(gets(str)!=NULL) //需注意字符串中可能含有空格,不能用scanf("%s",str)!=EOF { if(strcmp(str,"!")==0) break; for(i=0;i<strlen(str);i++) { if(str[i]>='A' && str[i]<='Z') str[i]=155-str[i]; else if(str[i]>='a' && str[i]<='z') str[i]=219-str[i]; } puts(str); } return 0;}程序截圖:
3. 搬水果
【分析】貪心算法,每次找出數組里面最小的兩個數組合,用sort排序一次一次求出最小的兩個值一定會超時,所以用特殊的選擇排序,每次都使數組前兩個數最小(只排前兩個),測試數組可能很大,其余后面的沒必要排序,節省時間。 其中要注意的一點,找出數組中最小值時,只需要統計下標,跳出循環后再讓他與首元素進行交換,防止在循環內交換次數過多造成超時!
源代碼:
#include <stdio.h>#define maxn 10010int main(){ int i,j,k,n,a[maxn]; int sum,t,x; while(scanf("%d",&n)!=EOF) { if(n==0) break; for(i=0;i<n;i++) scanf("%d",&a[i]); x=0,sum=0; while(x<n-1) { for(i=x;i<x+2;i++) { k=i; for(j=i+1;j<n;j++) { if(a[k]>a[j]) k=j; //標記最小值 } t=a[i]; //在循環外面交換,不需要每次交換,節省了交換時間 a[i]=a[k]; a[k]=t; } a[x+1]=a[x]+a[x+1]; sum+=a[x+1]; x++; } printf("%d/n",sum); } return 0;}程序截圖:
新聞熱點
疑難解答