题目一
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变(A
N−M⋯AN−1A0A1 ⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
#include<stdio.h>
int a[10001];
int main()
{
int num,wei,temp;
int i,j;
scanf("%d %d",&num,&wei);
for(i = 0; i < num; i++)
{
scanf("%d",&a[i]);
if(getchar() == '\n')
break;
}
for(i = 0; i < wei; i++)
for(j = num-1;j > 0; j--)
{
if(j == num-1)
{
temp = a[num-(j+1)];
a[num-(j+1)] = a[j];
continue;
}
if(j == 1)
{
a[j+1] = a[j];
a[j] = temp;
continue;
}
a[j+1] = a[j];
}
for(i = 0; i < num; i++)
{
if(i == num-1)
printf("%d",a[i]);
else
printf("%d ",a[i]);
}
return 0;
}
题目二
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
#include<stdio.h>
#include<string.h>
char a[100];
int b[100] = {0};
char c[100];
int main()
{
int i,j,k=0,temp,len;
gets(a);
len = strlen(a);
temp = len;
a[len] = '\0';
for(i = 0; i < len; i++)
{
if(a[i] == ' ')
b[i] = i;
}
for(i = len; i > 0; i--)
{
if(b[i])
{
j = b[i]+1;
while(a[i] == '\0' || j < temp)
{
c[k] = a[j];
j++;
k++;
}
c[k] = ' ';
k++;
temp = b[i];
}
}
for(i = 0; i < temp; i++)
{
c[k] = a[i];
k++;
}
c[len] = '\0';
printf("%s",c);
return 0;
}
题目三
设计函数求一元多项式的导数。(注:x
n
(n为整数)的一阶导数为nx
n−1
。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
#include<stdio.h>
main()
{
int a=0,b=0,g=0;
scanf("%d %d",&a,&b);
if(b==0)
{
printf("0 0");
return 0;
}
else if(b!=0)
{
printf("%d %d",a*b,b-1);
}
while(scanf("%d %d",&a,&b))
{
if(b<-1000)
{
return 0;
}
if(b==0)
{
return 0;
}
else if(a==0&&b==0)
{
printf(" 0 0");
return 0;
}
else if(b!=0)
{
printf(" %d %d",a*b,b-1);
}
// b=g;
}
return 0;
}