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 81
int 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 10010
int 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;
}
程序截图: