今天一直在刷题目,但是头疼的是有几个题目oj一直过不去,也暂时先记录下来,怕自己找不到位置,几乎是知错了一个样例,但却死活没找出是哪个。。。
数字拆分:
给定一组整数 l 和 r,(1 <= l <= r <= 100000), 再给定一个整数 t (0 <= t <= 9),求 [l, r] 之间的数的十进制表示中会出现多少个 t。
这题我开始是打算写一个函数去做,但是发现又麻烦而且还不好弄,于是直接暴力求解。
#include <stdio.h>
int divide(int n)
{
}
int main()
{
int l,r,t;
scanf("%d %d %d",&l,&r,&t);
int i;
int count = 0;
int temp;
int temp2;
for(i = l; i <= r; i++)
{
if(i < 10)
{
if( i == t)
{
count++;
}
}else{
temp = i;
while(temp > 0)
{
temp2 = temp%10;
temp /= 10;
if(temp2 == t)
{
count++;
}
}
}
}
printf("%d",count);
return 0;
}
打印金字塔:
输入n值,打印下列形状的金字塔,其中n代表金字塔的层数。
这题应该是直接写出来的。。。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int i,j;
for(i = 1; i <= n; i++)
{
for(j = i; j < n; j++)
{
printf(" ");
}
for(j = 1; j <= i; j++)
{
printf("%d",j);
if(i != 1)
{
printf(" ");
}
}
for(j = i - 1; j > 0; j--)
{
printf("%d",j);
if(j != 1)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
按指定位置输出:
设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置m开始的n个数按逆序重新排列并输出新的完整数列。
这题我开始一直想着用一个数组,把一个数组倒序输出就行,后来几次错误证实了这个想法的不可行性,于是便用了两个数组去储存,再将一个数组返向储存回原数组进行 输出。
#include <stdio.h>
int a[10],b[10];
int main()
{
int i;
char c1,c2,c;
for(i = 0;i < 10; i++)
{
scanf("%d",&a[i]);
b[i] = a[i];
}
getchar();
int n,m;
int j,k = 0;
scanf("%c:%d",&c1,&m);
getchar();
scanf("%c:%d",&c2,&n);
for(i = m,j = m + n - 1;k < n;i++,j--,k++)
{
a[i] = b[j];
}
for(i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
return 0;
}
斐波那契数列:
编写一个求斐波那契数列的递归函数,输入n值,使用该递归函数,输出如样例输出的斐波那契数列。
这个斐波那契数列与一般的斐波那契不同,我开始只当做一个简单的数列,直接去求和,后来发现是挨个输出,尤其记住前面有个0;
#include <stdio.h>
void fib(int n)
{
if(n == 0)
{
return ;
}else{
fib(n - 1);
int a=1,b=1,temp;
int i;
printf("0");
for(i = 1; i < n; ++i)
{
printf(" %d %d",a,b);
temp = a + b;
a = temp;
b += temp;
}
printf("\n");
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
fib(n);
}
return 0;
}
小谭吃东西:
话说我们家小谭啊,他特别的好吃懒做,对于吃还很挑剔,有一天他得到了一堆的饮料,他就想要喝掉这些饮料,但是他喝饮料有个特殊的习惯,那就是不喜欢连续两次喝相同的饮料,小谭不知道是否存在一种喝饮料的顺序使得他能够喝完所有的饮料,所以他请你帮他写个程序来测一测。
#include <stdio.h>
int arr[100000];
int main()
{
int n;
double max = 0,min = 0;
while(scanf("%d",&n)!=EOF)
{
int i;
for(i = 0; i < n; i++)
{
scanf("%d",&arr[i]);
}
for(i = 0; i < n; i++)
{
if(max < arr[i])
{
max = arr[i];
}
}
for(i = 0; i < n; i++)
{
min += arr[i];
}
min -= max;
if((min + 1) >= max)
printf("yes\n");
else
printf("no\n");
max = 0;
min = 0;
}
return 0;
}
小叶子学英文:
题目描述
小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。
由于数太大了所以只能用字符型数组去记录,但是有一组样例实在过不去我也找不出是哪一个。。。
#include <stdio.h>
#include <string.h>
char str[100000000];
int arr[10000000];
int SUM[10000000];
int main()
{
gets(str);
long long int len = strlen(str);
long long int sum = 0;
for(int i = 0; i < len; i++)
{
arr[i] = str[i];
}
for(int i = 0; i < len; i++)
{
sum += arr[i] - '0';
}
long long int i = 0;
long long int flag = 0;
// printf("%d\n",sum);
while(sum > 0)
{
SUM[++i] = sum % 10;
sum /= 10;
flag++;
}
while(flag != 0)
{
i = flag;
if(SUM[i] == 9)
printf("nine ");
if(SUM[i] == 8)
printf("eight ");
if(SUM[i] == 7)
printf("seven ");
if(SUM[i] == 6)
printf("six ");
if(SUM[i] == 5)
printf("five ");
if(SUM[i] == 4)
printf("four ");
if(SUM[i] == 3)
printf("three ");
if(SUM[i] == 2)
printf("two ");
if(SUM[i] == 1)
printf("one ");
if(SUM[i] == 0)
printf("zero ");
flag--;
}
return 0;
}
在加上数组好像开大了时间就超限了。。。
将对应字母交叉:
输入2个字符串,将对应字母交叉组成第三个字符串,最后输入第三个字符串。例如输入的2个字符串分别是“abcd”和“1234”,则合并后的字符串是“a1b2c3d4”。若2个字符串的长度不等,则其中的一个字符串多余的部分放在结果字符串的尾部,如2个字符串分别是“banana”和“12”,则合并后的字符串是“b1a2nana”
要求:第一个字符串的第一个字母总是结果串的第一个字母。
这题目我也不知道到底错了哪里,不论是样例还是我自己随便输入的数据也没点问题,oj就是过不去。。。硬要找问题出来可能就是我只用了两个数组
#include <stdio.h>
#include <string.h>
char c1[20],c2[20];
int main()
{
int i;
gets(c1);
gets(c2);
int lenA = strlen(c1);
int lenB = strlen(c2);
for(i = 0;i < (lenA+lenB);i++)
{
printf("%c",c1[i]);
printf("%c",c2[i]);
}
return 0;
}