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;}程序截图:
新闻热点
疑难解答