典题
都是自己写的,如果代码有不好的地方,望请指出,哥只是一个小菜。这里将收集我自己觉得需要花点脑经的题目。题目会不断的累加,以便自己不断的积累编程经验和编程的一些技巧和思想。
1.实现一个函数,传递一个整形参数,如果这个整数可以分解成连续的自然数相加,则把所有的可能输出,否则,输出无法分解。
例如:
输入:15
输出:
15 = 1+2+3+4+5
15 = 4+5+6
15 = 7+8
输入:4
输出:无法分解
哥的源码:
#include <stdio.h>
void func(n)
{
int i;
int j;
int sums;
int flag =0;
int k;
int show =0;
for(i=1;i <= n/2;i++)
{
flag = 0;
sums =0;
for(j=i;j <= n/2+1;j++)
{
sums += j;
if(sums==n)
{
flag =1;
show =1;
break;
}
}
if(flag ==1)
{
printf("%d=",n);
for(k=i;k<=j;k++)
{
printf("%d",k);
if(k<j)printf("+");
}
printf("\n");
}
}
if(show==0)
printf("无法分解");
}
int main(void)
{
int n;
scanf("%d",&n);
func(n);
return 0;
}
2.实现一个函数,传递一个整数参数,返回这个整数参数的阶乘的末尾有多少个0,并在main函数里输出。
例如:
输入:9
输出:1
输入:3
输出:0
输入:788
输出:195
哥的源码:
/*#include <stdio.h>
#include <math.h>
int sum(int n)
{
int i=0;
int j=0;
int s=0;
int b =n;
while(n>=5)
{
n /= 5;
i++;
}
for(j=1;j<=i;j++)
{
s += b/pow(5,j);
}
return s;
}
int main(void)
{
int n;
scanf("%d",&n);
printf("%d",sum(n));
return 0;
}*/
3. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限
比如:
输入:5 18
输出:
1 2 3 4 5
16 17 18 0 6
15 0 0 0 7
14 0 0 0 8
13 12 11 10 9
输入: 4 12
输出:
1 2 3 4
12 0 0 5
11 0 0 6
10 9 8 7
哥写的源码:
#include <stdio.h>
int main(int argc, const char * argv[])
{
int n, m;
int arr[20][20];
scanf("%d%d",&n,&m);
int j;
int i;
int rdes = n;
int ddes = n;
int ldes = 0;
int udes = 1; // 赋值方向
int type = 1;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
arr[i][j]= 0;
}
}
i=1;
while(i <= m)
{
switch(type)
{
case 1: // 向右
for(j=ldes; j<rdes; j++,i++)//0-5
{
arr[ldes][j] = i; // 赋值
if(i==m)
{
i++;
break;
}
}
type = 2;
rdes--; //4
break;
case 2: // 向下
for(j=udes; j<ddes; j++,i++) //1-5
{
arr[j][rdes] = i;
if(i==m)
{
i++;
break;
}
}
type = 3;
ddes --; //4
break;
case 3: // 向左
for (j=rdes-1; j>=ldes; j--,i++)
{
arr[rdes][j] = i;
if(i == m)
{
i++;
break;
}
}
type = 4;
ldes++;
break;
case 4: // 向上
for (j=ddes-1; j>=udes; j--,i++)
{
arr[j][ldes-1] = i;
if(i == m)
{
i++;
break;
}
}
type = 1;
udes++;
break;
}
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%5d",arr[i][j]);
}
printf("\n");
}
return 0;
}
4. 输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列
比如:
输入:1 5 9 8 12 21 3 0 -1 9
输出:
1 5 9
9 8
8 12 21
21 3 0 -1
-1 9
输入: 3 9 8 -11 4 21 8 -3 0 2
输出:
3 9
9 8 -11
-11 4 21
21 8 -3
-3 0 2
哥写的源码:
#include <stdio.h>
int main(void)
{
int a[11] ={0};
int i;
int j=0;
for (i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
int flag =1;
int k = 0;
for (i=1; i<=9; i++) {
if((a[i-1]<a[i]&&a[i]>a[i+1])||(a[i-1]>a[i]&&a[i]<a[i+1])|| i==9)
{
flag = 0;
j = i;
}
if(flag == 0)
{
for( ;k<=j;k++)
{
printf("%d ",a[k]);
}
printf("\n");
k = j;
flag = 1;
}
}
return 0;
}