day 1
1. 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
#include <stdio.h>
int main(void)
{
long int a,s=0;
long int i,k;
scanf("%ld",&a);
if(a<0)
{
a=-a;
for(i=0;a!=0;a/=10)
{
k=a%10;
s=s*10+k;
}
s=-s;
}
else
{
for(i=0;a!=0;a/=10)
{
k=a%10;
s=s*10+k;
}
}
printf("%ld",s);
return 0;
}
2. 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,
即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
输入确保在 1 到 3999 的范围内。
示例 1:
输入: “III”
输出: 3
示例 2:
输入: “IV”
输出: 4
示例 3:
输入: “LVIII”
输出: 58
#include <stdio.h>
#include <string.h>
int main(void)
{
char luoma[1000];
int i,k;
int s=0;
scanf("%s",luoma);
for(i=0;luoma[i]!=0;i++);
//计数;
if(i<1 || i>3999)
{
printf("输入有误!请重新输入");
}
else
{
for(k=0;k<i;k++)
{
if (luoma[k] == 'I' && luoma[k+1] == 'V')
{
s += 4;
k = k + 2;
}
if (luoma[k] == 'I' && luoma[k+1] == 'X')
{
s += 9;
k = k + 2;
}
if (luoma[k] == 'X' && luoma[k+1] == 'L')
{
s += 40;
k = k + 2;
}
if (luoma[k] == 'X' && luoma[k+1] == 'C')
{
s += 90;
k = k+2;
}
if (luoma[k] == 'C' && luoma[k+1] == 'D')
{
s += 400;
k = k + 2;
}
if (luoma[k] == 'C' && luoma[k+1] == 'M')
{
s += 900;
k = k + 2;
}
if (luoma[k] == 'M')
{
s += 1000;
}
if (luoma[k] == 'D')
{
s += 500;
}
if (luoma[k] == 'C')
{
s += 100;
}
if (luoma[k] == 'L')
{
s += 50;
}
if (luoma[k] == 'X')
{
s += 10;
}
if (luoma[k] == 'V')
{
s += 5;
}
if (luoma[k] == 'I')
{
s += 1;
}
}
printf("%d",s);
}
return 0;
}
3. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
示例 2:
输入: 3
输出: 3
实质是斐波那契数列
1 2 3 5 8 13 21
方法一:
#include <stdio.h>
int main(void)
{
int a=0,b=1,s;
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
s=a+b;
a=b;
b=s;
}
printf("%d",s);
}
方法二:
#include <stdio.h>
int fun(int n);
int main(void)
{
int n;
scanf("%d",&n);
printf("%d",fun(n));
}
int fun(int n)
{
if(n==0)
{
return 1;
}
if(n==1)
{
return 1;
}
else
{
return fun(n-1)+fun(n-2);
}
}
day 2
1. 输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。
示例 1:
输入: 1926 8
输出: 31
示例 2:
输入: 2000 2
输出: 29
#include <stdio.h>
int main(void)
{
int year,month;
scanf("%d %d",&year,&month);
if( ((year%100 !=0 && year%4 == 0) || year%400 == 0))
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
printf("31");
}
else if(month==2)
{
printf("29");
}
else
{
printf("30");
}
}
else
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
printf("31");
}
else if(month==2)
{
printf("28");
}
else
{
printf("30");
}
}
return 0;
}
2. 给定两个按照升序排列的数组,将它们合并成一个新的数组(新的数组按照降序排列)
说明:数组不限制大小
示例 1:
给定的数组1:
[1, 3, 7, 9]
给定的数组2:
[-1, 0, 5, 8]
新数组:
[9, 8, 7, 5, 3, 1, 0, -1]
.
示例 2:
给定的数组1:
[1, 3, 4, 10, 12]
给定的数组2:
[-5, 3, 6]
新数组:
[12, 10, 6, 3, 3, 1, -5]
.
示例 3:
给定的数组1:
[3, 5, 7, 9, 12, 15]
给定的数组2:
[0, 8, 10]
新数组:
[15, 12, 10, 9, 8, 7, 5, 3, 0]
归并排序:
#include <stdio.h>
void fun(int a[], int b[], int c[], int lena,int lenb);
int main(void)
{
int i,lena,lenb;
int a[] = {1, 3, 7, 9};
int b[] = {-1, 0, 5, 8};
lena = sizeof(a)/sizeof(a[0]);
lenb = sizeof(b)/sizeof(b[0]);
int c[lena + lenb];
fun(a, b, c, lena, lenb);
for(i = 0; i < lena+lenb; i++)
{
printf("%d ", c[i]);
}
}
void fun(int a[], int b[], int c[], int lena,int lenb){
int i=0, j=0, k=0;
while(i != lena && j != lenb)
{
if(a[i] < b[j])
{
c[k++] = a[i++];
}
else
{
c[k++] = b[j++];
}
}
if(i == lena)
{
while(j != lenb)
{
c[k++] = b[j++];
}
}
else
{
while(i != lena)
{
c[k++] = a[i++];
}
}
}
3. 排序算法
---------3.1 直接插入排序
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,j,k,t;
int temp;
for(i=1;i<10;i++)
{
temp=a[i];
for(k=i-1;k>=0 && temp>a[k];k--)
{
a[k+1]=a[k];
}
a[k+1]=temp;
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
---------3.2 选择法排序
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,j,k,temp;
for(i=0;i<9;i++)
{
for(k=i+1;k<10;k++)
{
if(a[i]<a[k])
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
---------3.3 冒泡排序
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,j,k;
int temp;
for(i=0;i<9;i++)
{
for(k=0;k<9;k++)
{
if(a[k]<a[k+1])
{
temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
day 3
1. 请计算 1 +(1+2)+(1+2+3)+…+(1+2+3+…+n)
说明:
输入描述:输入一个整数
输出描述:输出一个整数
示例 1:
输入:
4
输出:
20
#include <stdio.h>
int small(int i);
int main(void)
{
int n,i,j,sum=0;
scanf("%d", &n);
for(i=0; i<=n; i++)
{
sum += small(i);
}
printf("%d", sum);
return 0;
}
int small(int i)
{
int s=0, j;
for(j=1; j<=i; j++)
{
s+=j;
}
return s;
}
2. 找出一个数组中出现次数最多的那个元素。
说明:
输入描述:
第一行输入一个整数n(不大于20),
第二行输入n个整数,
输出描述:
找出n个整数中出现次数最多的那个整数,
如果有多个,输出最先出现的那个。
示例 1:
输入:
4
1 2 2 3
输出:
2
方法一:桶
#include <stdio.h>
int small(int i);
int main(void)
{
int n, i, key, max;
scanf("%d", &n);
int a[n];
int buttom[n+1] = {0};
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<n; i++)
{
buttom[a[i]]++;
}
max=0;
for(i=0; i<n+1; i++)
{
if( buttom[i]> max)
{
max = buttom[i];
key = i;
}
}
printf("%d", key);
return 0;
}
方法二:
#include <stdio.h>
int small(int i);
int main(void)
{
int n, i, k, key;
int t=0, max=0;
scanf("%d", &n);
int a[n];
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<n-1 ;i++)
{
for(k=i; k<n; k++)
{
if( a[i]==a[k] )
{
t++;
}
}
if(max < t)
{
max = t;
key = a[i];
}
}
printf("%d", key);
return 0;
}
3. 找出一个数组中出现次数最多的那个元素(时间复杂度为O(n))
说明:
输入描述:输入一行,
包含一个整数n(1 <= n <= 200)
输出描述:输出一行,包含一个整数
示例 1:
输入:
100
输出:
541
没有任何循环嵌套
桶
#include <stdio.h>
int small(int i);
int main(void)
{
int n, i, key, max;
scanf("%d", &n);
int a[n];
int buttom[n+1] = {0};
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(i=0; i<n; i++)
{
buttom[a[i]]++;
}
max=0;
for(i=0; i<n+1; i++)
{
if( buttom[i]> max)
{
max = buttom[i];
key = i;
}
}
printf("%d", key);
return 0;
}
day 4
1. 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射与电话9键对应字母相同。
注意 1 不对应任何字母。
示例
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]
#include <stdio.h>
int main(void)
{
int n, a, b;
int i, j, k, p;
char *character[10]={ "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
scanf("%d", &n);
b = n % 10;
a = n / 10;
if( a>1 && a<10 && b>1 && b<10 )
{
a = a - 2;
b = b - 2;
for(i=a, j=0; character[i][j] != 0; j++)
{
for(k=b, p=0; character[k][p] != 0; p++)
{
printf("%c%c ",character[i][j], character[k][p]);
}
}
}
else
{
printf("error!");
}
return 0;
}
2. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
上面的格式写不出…
我的格式
输入:
1 2 4
1 3 4
输出:
1->1->2->3->4->4
#include<stdio.h>
#include <stdlib.h>
struct ListNode {
int number;
struct ListNode *next;
};
struct ListNode *printlist( struct ListNode *head )
{
struct ListNode *p = head;
while(p)
{
printf("%d", p->number);
if(p->next != NULL)
{
printf(" -> ");
}
p = p->next;
}
}
struct ListNode *readlist();
struct ListNode *creatlist(struct ListNode *head_1, struct ListNode *head_2);
int main(void)
{
struct ListNode *head_1, *head_2, *head;
head_1 = readlist();
head_2 = readlist();
head = creatlist(head_1, head_2);
printlist(head);
return 0;
}
struct ListNode *readlist()
{
struct ListNode *p, *head, *tail;
head = tail = NULL;
p = ( struct ListNode *) malloc (sizeof(struct ListNode));
scanf("%d", &p->number);
while( p->number!=-1)
{
if(head == NULL)
{
head = p;
head->next = NULL;
}
if(tail != NULL)
{
tail->next = p;
}
tail = p;
tail->next = NULL;
p = ( struct ListNode *) malloc (sizeof(struct ListNode));
scanf("%d", &p->number);
}
return head;
}
struct ListNode *creatlist(struct ListNode *head_1, struct ListNode *head_2)
{
struct ListNode *head, *q, *tail, *h1, *h2;
q = (struct ListNode*) malloc(sizeof(struct ListNode));
h1 = head_1, h2 = head_2;
head = tail =NULL;
while(h1 && h2)
{
if(h1->number < h2->number)
{
if(head == NULL)
{
head = q;
head->next = NULL;
}
if(tail != NULL)
{
tail->next = q;
}
q->number = h1->number;
tail = q;
tail->next = NULL;
q = (struct ListNode*) malloc(sizeof(struct ListNode));
h1 = h1->next;
}
else
{
if(head==NULL)
{
head=q;
head->next=NULL;
}
if(tail!=NULL)
{
tail->next = q;
}
q->number = h2->number;
tail = q;
tail->next = NULL;
q = (struct ListNode*) malloc(sizeof(struct ListNode));
h2 = h2->next;
}
}
if(h1==NULL)
{
while(h2)
{
if(tail!=NULL)
{
tail->next = q;
}
q->number = h2->number;
tail = q;
tail->next = NULL;
q = (struct ListNode*) malloc(sizeof(struct ListNode));
h2 = h2->next;
}
}
else
{
while(h1)
{
if(tail != NULL)
{
tail->next = q;
}
q->number = h1->number;
tail = q;
tail->next = NULL;
q = (struct ListNode*) malloc(sizeof(struct ListNode));
h1 = h1->next;
}
}
return head;
}
3. 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
不小心考虑数组中超出新长度后面的元素。。。。
#include <stdio.h>
int main(void)
{
int nums[] = {0,0,1,1,1,1,1,2,2,2,2,3,3,4};
int len, flag=0, t=0;
int i,j,k;
len = sizeof(nums)/sizeof(nums[0]);
for(i=0; i<len-1; i++)
{
if(flag != 0 && t!=0)
{
i--;
j--;
flag = 0;
}
for(j=i+1; j<len; j++)
{
if(nums[i] == nums [j])
{
for(k=i; k<len-1; k++)
{
nums[k] = nums[k+1];
flag++;
}
len--;
if(flag != 0)
{
t++;
break;
}
}
}
}
for(i=0; i<len; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
day 5
1.数组中的最大值和次大值
输入n,然后输入一个长度为n的数组,输出这个数组的最大值和次大值(时间复杂度为O(n))
输入:
5
4 2 0 1 -3
输出
4 2
#include<stdio.h>
int main(void)
{
int n;
int i,j;
scanf("%d", &n);
int a[n];
for(i=0; i<n; i++)
{
scanf("%d", &a[i]);
}
int max_first = a[0];
for(i=0; i<n; i++)
{
if(a[i] > max_first)
{
max_first = a[i];
}
}
int max_second = a[0];
for(i=0; i<n; i++)
{
if(a[i] > max_second && a[i] < max_first)
{
max_second = a[i];
}
}
printf("%d %d", max_first, max_second);
return 0;
}
2.螺旋矩阵
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入:
3
输出:
1 2 3
8 9 4
7 6 5
#include<stdio.h>
int main(void)
{
int m, n=1;
int i,j,k;
scanf("%d", &m);
int a[m][m];
for(i=0; i<m/2+1; i++)
{
for(j=i; j<(m-i); j++)
{
a[i][j] = n++;
}
for(k=i+1; k<(m-i-1); k++)
{
a[k][m-i-1] = n++;
}
for(j=(m-i-1); j>i; j--)
{
a[m-i-1][j] = n++;
}
for(k=(m-i-1); k>i; k--)
{
a[k][i] = n++;
}
}
for(i=0; i<m; i++)
{
for(j=0; j<m; j++)
{
printf("%2d ", a[i][j]);
}
printf("\n");
}
return 0;
}
3. 二分查找
这段话是百度查的(还是好好读一下)
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功
#include <stdio.h>
#include <stdlib.h>
int fold_search( int a[], int len, int key );
void print(int a[], int len);
int main(void)
{
int key,len;
int i,j,k;
scanf("%d", &key);
int a[]={1,3,9,41,56,67,89,98,112,132,164,178,198,200};
len = sizeof(a)/sizeof(a[0]);
if( fold_search( a, len, key ) == -1 )
{
printf("查找失败");
}
else
{
printf("查找成功,在a[]中第 %d 个", fold_search( a, len, key )+1);
}
return 0;
}
int fold_search( int a[], int len, int key )
{
int low=0, high=len-1;
while( low <= high )
{
if( a[(low+high)/2] < key )
{
low = (low+high)/2 + 1;
}
else if ( a[(low+high)/2] > key )
{
high = (low+high)/2 - 1;
}
else
{
return (low+high)/2 ;
}
}
return -1;
}
day 6
1.求一元多项式的导数。
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
#include <stdio.h>
int main(void)
{
int xi, zhi;
do{
scanf("%d %d", &xi, &zhi);
if(zhi-1>=0)
printf("%d %d", xi*zhi, zhi-1 );
if(zhi-1!=0)
printf(" ");
}while(zhi != 0);
return 0;
}
2. 组织星期信息 .
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
定义一个指针数组将下面的星期信息组织起来,输入一个字符串,在表中查找,若存在,输出该字符串在表中的序号,否则输出-1。
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
输入输出示例:括号内为说明,无需输入输出
输入样例 (repeat=3) :
3
Tuesday
Wednesday
year
输出样例:
3
4
-1
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,day,x;
char *date[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char str[10000];
scanf("%d",&x);
for(day=1;day<=x;day++)
{
scanf("%s",str);
for( i=0;i<7;i++ )
if ( !strcmp( date[i] , str ) )
break ;
if ( i >= 7 )
printf("-1\n");
else
printf("%d\n" , i+1 );
}
return 0;
}
day 7
1. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
#include <stdio.h>
int fun(int a);
int main(void){
int s = fun(4)/fun(1);
printf("%d", s);
}
int fun(int a){
int fact=1;
for(int i=1; i<=a; i++)
{
fact=fact*i;
}
return fact;
}
2. 企业发放的奖金根据利润提成。
利润:
- 低于或等于10万元时,奖金可提10%;
- 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
- 20万到40万之间时,高于20万元的部分,可提成5%;
- 40万到60万之间时高于40万元的部分,可提成3%;
- 60万到100万之间时,高于60万元的部分,可提成1.5%;
- 高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润 I ,求应发放奖金总数?
#include<stdio.h>
int main()
{
int I=0,money1, money2, money3, money4, money5;
int bonus=0;//奖金
money1 = 100000 * 0.1; //十万元奖金
money2 = money1 + 100000 * 0.075; //二十万元奖金
money3 = money2 + 200000 * 0.05; //四十万元奖金
money4 = money3 + 200000 * 0.03; //六十万元奖金
money5 = money4 + 400000 * 0.01; //一百万元奖金
printf("请输入本月利润I:");
scanf("%d", &I);
if (I<=100000)
{
bonus = I*0.1;
}
else if (I <= 200000)
{
bonus = money1 + (I - 100000)*0.075;
}
else if (I <= 400000)
{
bonus = money2 + (I - 200000)*0.05;
}
else if (I <= 600000)
{
bonus = money3 + (I - 400000)*0.03;
}
else if (I <= 1000000)
{
bonus = money4 + (I - 600000)*0.015;
}
else
bonus = money5+(I-1000000)*0.01;
printf("本月的奖金为%d",bonus);
return 0;
}
3. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#include <stdio.h>
#include <math.h>
int main(void)
{
int i,j,k;
int t=0;
while(1)
{
for(i=1; i=1; i++)
{
for(j=1; j<=i; j++)
{
if(pow(j, 2)==i)
break;
}
if(pow(j, 2)==i)
break;
}
for(k=1; k<sqrt(i)+1; k++)
{
if(pow(k, 2)==i)
{
t++;
break;
}
}
if(t!=0)
{
break;
}
}
printf("%d", i);
return 0;
}
day 8
1. 输入某年某月某日,判断这一天是这一年的第几天?
输出样例:
请输入年、月、日,格式为:年,月,日(2015,12,10)
2015,10,1
这是这一年的第 274 天。
#include <stdio.h>
int main(void)
{
int year,month,day,s=0;
scanf("%d %d %d",&year, &month, &day);
if( ((year%100 !=0 && year%4 == 0) || year%400 == 0)){
for(int i=month-1; i>0; i--){
if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
s += 31;
}
else if(i==2){
s += 29;
}
else{
s += 30;
}
}
}
else{
for(int i=month-1; i>0; i--){
if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12){
s += 31;
}
else if(i==2){
s += 28;
}
else{
s += 30;
}
}
}
printf("%d", s+day);
return 0;
}
2. 输入三个整数x,y,z,请把这三个数由小到大输出。
输出样例:
请输入三个数字:
1
3
2
从小到大排序: 1 2 3
#include <stdio.h>
int main(void)
{
int x,y,z;
scanf("%d %d %d", &x, &y, &z);
int min, mid, max;
min = (((x<y)?x:y)<z)?((x<y)?x:y):z;
max = (((x>y)?x:y)>z)?((x>y)?x:y):z;
if(max!=x && min!=x)
mid = x;
if(max!=y && min!=y)
mid = y;
if(max!=z && min!=z)
mid = z;
printf("%d %d %d", min, mid, max);
}
3. 古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
1 2 3 4 5 6
1 1 2 3 5 8
方法一:递归
#include <stdio.h>
int fun(int n);
int main(void)
{
int i, s;
for(i=1; i<=40; i++){
s = fun(i);
printf("第%d月 = %d 只\n",i, s);
}
return 0;
}
int fun(int n){
if(n==0){
return 0;
}
if(n==1){
return 1;
}
else{
return fun(n-1)+fun(n-2);
}
}
方法二
#include <stdio.h>
int main(void)
{
int a=0,b=1,s=1;
int i;
printf("第一月有%d只\n",s);
for(i=1;i<=40;i++)
{
s=a+b;
a=b;
b=s;
printf("第%d 月有%d只\n", i, s);
}
}
4. 输入一个正的奇数n(1≤n≤9),打印一个高度为n的、由“*”组成的沙漏图案。当n=5时,输出如下沙漏图案:
#include <math.h>
#include <stdio.h>
int main()
{
int i, j, m, n;
scanf("%d", &n);
m = n/2;
for(i=m+1;i>=1;i--) {
for (j=1;j<=m+1-i;j++){
printf (" ");
}
for (j = 1; j <= 2 * i - 1; j++){
printf ("*");
}
printf ("\n");
}
for (i=2;i<=m+1;i++){
for (j=m+1-i;j>=1;j--){
printf (" ");
}
for (j = 1; j <= 2 * i - 1; j++){
printf ("*");
}
printf ("\n");
}
}
day 9 排序算法
- 冒泡排序
#include<stdio.h>
int main(void)
{
int a[]={1,2,5,4,8,7,9,12,45,68};
int i,j;
int len = sizeof(a)/sizeof(a[0]);
for(i=0; i<len-1; i++){
for(int k=0; k<len-1; k++){
if(a[k] < a[k+1]){
int temp = a[k];
a[k] = a[k+1];
a[k+1] = temp;
}
}
}
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
- 选择法排序
#include<stdio.h>
int main(void)
{
int a[]={1,2,5,4,8,7,9,12,45,68};
int i,j;
int len = sizeof(a)/sizeof(a[0]);
for(i=0; i<len-1; i++){
for(j=i+1; j<len; j++){
if(a[i] > a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
- 插入法排序
#include<stdio.h>
int main(void)
{
int a[]={1,2,5,4,8,7,9,12,45,68};
int i,j,k;
int len = sizeof(a)/sizeof(a[0]);
for(i=1; i<len; i++){
int temp = a[i];
for(j=i-1; j>=0 && temp > a[j]; j--){
a[j+1] = a[j];
}
a[j+1] = temp;
}
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
return 0;
}
- 归并排序
#include <stdio.h>
void fun(int a[], int b[], int c[], int lena,int lenb);
int main(void)
{
int i,lena,lenb;
int a[] = {1, 3, 7, 9};
int b[] = {-1, 0, 5, 8};
lena = sizeof(a)/sizeof(a[0]);
lenb = sizeof(b)/sizeof(b[0]);
int c[lena + lenb];
fun(a, b, c, lena, lenb);
for(i = 0; i < lena+lenb; i++)
{
printf("%d ", c[i]);
}
}
void fun(int a[], int b[], int c[], int lena,int lenb){
int i=0, j=0, k=0;
while(i != lena && j != lenb)
{
if(a[i] < b[j])
{
c[k++] = a[i++];
}
else
{
c[k++] = b[j++];
}
}
if(i == lena)
{
while(j != lenb)
{
c[k++] = b[j++];
}
}
else
{
while(i != lena)
{
c[k++] = a[i++];
}
}
}
day 10
1. 斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…
这个数列从第3项开始,每一项都等于前两项之和。
#include <stdio.h>
int fun(int n);
int main(void)
{
int n,s;
scanf("%d", &n);
s = fun(n);
printf("%d", s);
return 0;
}
int fun(int n)
{
if(n == 0){
return 0;
}
else if(n == 1){
return 1;
}
else{
return fun(n-2)+fun(n-1);
}
}
2. 最大公约数和最小公倍数。
用户输入两个数,求这两个数的最大公约数和最小公倍数。
#include <stdio.h>
void common_divisor(int n, int m);
void common_multiple(int n, int m);
int main(void)
{
int n,m;
scanf("%d %d", &n, &m);
common_divisor(n, m);
common_multiple(n, m);
return 0;
}
void common_divisor(int n, int m)
{
int i, min;
min = (n<m)?n:m;
for(i=min; i>0; i--){
if(n%i==0 && m%i==0){
printf("Max common divisor is %d\n", i);
break;
}
}
}
void common_multiple(int n, int m)
{
int i, max;
max = (n>m)?n:m;
for(i=max;;i++){
if(i%n==0 && i%m==0){
printf("Min common multiple is %d\n", i);
break;
}
}
}
3. 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
分析
reverse(5)
reverse(4)
reverse(3)
reverse(2)
reverse(1)
print(1)
print(2)
print(3)
print(4)
print(5)
#include <stdio.h>
void reverse(int n);
int main(void)
{
printf("please input 5 numbers:");
reverse(5);
return 0;
}
void reverse(int n)
{
char next;
if(n == 1)
{
next = getchar();
putchar(next);
}
else
{
char next = getchar();
reverse(n-1);
putchar(next);
}
}
4. 打印出如下图案(菱形)。
*
***
*****
*******
*****
***
*
#include <stdio.h>
int main(void)
{
int n;
int i, j ,k;
scanf("%d", &n);
/*上三角*/
for(i=1; i<=n; i++){
for(j=0; j<n-i; j++){
printf(" ");
}
for(k=2*i-1; k>0; k--){
printf("*");
}
printf("\n");
}
/*下三角*/
for(i=1; i<n; i++){
for(j=i; j>0; j--){
printf(" ");
}
for(k=(n-i)*2-1; k>0; k--){
printf("*");
}
printf("\n");
}
return 0;
}
以前写过一个沙漏
*******
*****
***
*
***
*****
*******
#include <math.h>
#include <stdio.h>
int main()
{
int i, j, m, n;
scanf("%d", &n);
m = n/2;
for(i=m+1;i>=1;i--) {
for (j=1;j<=m+1-i;j++){
printf (" ");
}
for (j = 1; j <= 2 * i - 1; j++){
printf ("*");
}
printf ("\n");
}
for (i=2;i<=m+1;i++){
for (j=m+1-i;j>=1;j--){
printf (" ");
}
for (j = 1; j <= 2 * i - 1; j++){
printf ("*");
}
printf ("\n");
}
}
day 11
题目1:
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
#include <stdio.h>
int main(void)
{
int n;
int i, j, reverse=0, t=0;
printf("Please input a number less than 100000:");
scanf("%d", &n);
if(n>99999 || n<0){
printf("input error!");
}
else{
for(i=n; i>0; i/=10){
t++;
j = i%10;
reverse = reverse*10 + j;
}
}
printf("是%d位数\n", t);
printf("%d\n", reverse);
return 0;
}
题目2:
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#include <stdio.h>
int main(void)
{
int n;
int i, j, reverse=0, t=0;
printf("Please input a number less than 100000:");
scanf("%d", &n);
if(n>99999 || n<10000){
printf("input error!");
}
else{
for(i=n; i>0; i/=10){
j = i%10;
reverse = reverse*10 + j;
}
}
if(reverse == n)
printf("是回文数\n");
else
printf("不是回文数\n");
return 0;
}
题目3:
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
实例:
请输入第一个字母:
s
请输入下一个字母
a
saturday
#include <stdio.h>
int main(void)
{
char *week[20]={"monday", "tuesday", "wednesday", "thursday", "friday", "saturday" };
printf("please input the first character:");
fflush(stdin);
char a = getchar();
if(a == 't'){
printf("Can't judge by first character, please input the second character:");
fflush(stdin);
if(getchar() == 'u'){
printf("tuesday");
}
else{
printf("thursday");
}
}
else if(a == 's'){
printf("Can't judge by first character, please input the second character:");
fflush(stdin);
if(getchar() == 'u'){
printf("sunday");
}
else{
printf("saturday");
}
}
else if(a == 'm'){
printf("monday");
}
else if(a == 'w'){
printf("wednesday");
}
else if(a == 'f'){
printf("friday");
}
else{
printf("这么多年学白上了,连星期的开头首字母都不知的!");
}
return 0;
}
题目4:
删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。
#include<stdio.h>
int main(void)
{
char string[]={"acasaaasdfdgavnjka"};
int i,k=0;
printf("请输入需要删除的字母");
for(i=0; string[i]!=0; i++){
if(string[i] != 'a'){
string[k++] = string[i];
}
}
string[k] = 0;
printf("%s", string);
// for(k=0; string[k]!=0; k++){
// printf("%c", string[k]);
// }
return 0;
}
day 12
题目1:
封装函数判断一个数字是否为质数。
并且利用函数输出求100之内的素数。
#include <stdio.h>
void prime_number();
void prime_number_100();
int main(void)
{
int n;
prime_number();
prime_number_100();
return 0;
}
void prime_number(){
int n;
int i;
printf("Please input a number.");
scanf("%d", &n);
for(i=2; i<n; i++){
if(n%i==0){
break;
}
}
if(i==n){
printf("The number is prime number.\n");
}
else{
printf("The number is not prime number.\n");
}
}
void prime_number_100()
{
int i,j;
printf("The prime number between 1 and 100:");
for(i=2; i<98; i++){
for(j=2; j<i; j++){
if(i%j == 0){
break;
}
}
if(j == i){
printf("%d ", i);
}
}
}
题目2:
练习函数调用。
手动封装一个简单函数。
再通过循环将这个函数的输出结果调用3次;
例如:
以上实例输出结果为:
Hello, world!
Hello, world!
Hello, world!
#include <stdio.h>
void print();
int main(void)
{
int n;
for(int i=0; i<3; i++)
print();
return 0;
}
void print()
{
printf("Hello world!\n");
}
题目3:
字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char a[1000];
fflush(stdin);
gets(a);
for(int i=strlen(a)-1; i>=0; i--){
fflush(stdin);
printf("%c", a[i]);
}
return 0;
}
题目4:(二维数组)
求一个3*3矩阵对角线元素之和
#include <stdio.h>
int main(void)
{
int a[3][3]={1,2,3,
4,5,6,
7,8,9};
int s = 0;
for(int i=0; i<3; i++){
s += a[i][i];
}
printf("%d", s);
return 0;
}
day 13
题目1:
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
实例:
原始数组是:
1 4 6 9 13 16 19 28 40 100
插入一个新的数字: 10
1 4 6 9 10 13 16 19 28 40 100
#include <stdio.h>
int main(void)
{
int a[]={1,4,6,9,13,16,19,28,40,100};
int len = sizeof(a)/sizeof(a[0]);
int b[len+1];
int i,j=0,k=0,n;
int t=0;
for(i=0; i<len; i++){
printf("%d ", a[i]);
}
printf("\n");
scanf("%d" ,&n);
for(i=0; i<len+1; i++){
if(n<a[j]&&t==0){
b[k++] = n;
t++;
}
else{
b[k++] = a[j++];
}
}
for(i=0; i<len+1; i++){
printf("%d ", b[i]);
}
}
题目2:
将一个数组逆序输出。
实例:
原始数组是:
0 1 2 3 4 5 6 7 8 9
排序后的数组:
9 8 7 6 5 4 3 2 1 0
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,j,k;
int temp;
for(i=0;i<9;i++)
{
for(k=0;k<9;k++)
{
if(a[k]<a[k+1])
{
temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;
}
}
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
题目3:(结构体)
编写input()和output()函数输入,输出5个学生的数据记录。
输出如下:
请输入5个学生的信息:姓名 性别 年龄:
aaa m 15
bbb m 16
ccc m 15
ddd m 17
eee m 16
5个学生的信息如下:
姓名 性别 年龄
aaa m 15
bbb m 16
ccc m 15
ddd m 17
eee m 16
#include <stdio.h>
struct student{
char name[20];
char sex[10];
int age;
};
struct student input(){
struct student information;
scanf("%s %s %d", information.name, information.sex, &information.age);
return information;
}
void output(struct student information){
printf("%s %s %d\n", information.name, information.sex, information.age );
}
int main(void)
{
int i;
struct student a[5];
for(i=0; i<5; i++){
a[i] = input();
}
for(i=0; i<5; i++){
output(a[i]);
}
return 0;
}
题目4:
输入一个字符串
定义函数1: 去掉字符串前后的空字符串
定义函数2: 字符串去重
定义函数3: 返回字符串修改后的长度
案例: str = ’ aa111xiyounetbbb ’
输出:‘a1xiyounetb’
length:11
#include <stdio.h>
#include <string.h>
void blank(char a[]);
void repeat(char a[]);
int len(char a[]);
int main(void)
{
char a[200];
printf("请输入字符串:\n");
fflush(stdin);
gets(a);
blank(a);
repeat(a);
puts(a);
printf("%d", len(a));
return 0;
}
void blank(char a[])
{
int i, j;
while(1){
if(a[i] == ' '){
for(j=i; a[j]!=0; j++){
a[j] = a[j+1];
}
}
else{
i++;
if(a[i] == 0){
break;
}
}
}
}
void repeat(char a[])
{
int i=0, j;
while(1){
if(a[i] == a[i+1]){
for(j=i; a[j]!=0; j++){
a[j] = a[j+1];
}
}
else{
i++;
if(a[i] == 0){
break;
}
}
}
}
int len(char a[])
{
int len;
len = strlen(a);
return len;
}
day 14(JavaScript)
1. n 的阶乘:
function factorial(n) {
if (n === 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
var result = factorial(parseInt(window.prompt('input')));
document.write(result);
2.加法计数器
function sum() {
var result = 0;
for (var i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
document.write(sum(1, 2, 3, 4, 5));
3. 斐波那契
var n = window.prompt('input');
function fibonacci(n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
document.write(fibonacci(n));
4. 定义一组函数,输入数字,逆转并输出汉字形式
str.charAt (n):调用字符串单个字母的方法。
str[n]: 也行。
str.length
function reverse() {
var num = window.prompt('input');
var str = "";
for (var i = num.length - 1; i >= 0; i--) {
str += transfer(num[i]);
}
document.write(str);
}
function transfer(target) {
switch (target) {
case "1":
return "壹";
case "2":
return "贰";
case "3":
return "叁";
case "4":
return "肆";
case "5":
return "伍";
case "6":
return "陆";
case "7":
return "柒";
case "8":
return "捌";
case "9":
return "玖";
case "10":
return "拾";
}
}
reverse();
5. 写一个函数,功能告知你所选的小动物的叫声
function scream(animal) {
switch (animal) {
case "dog":
document.write('wang!');
break;
case "cat":
document.write('miao!');
break;
case "fish":
document.write("o~o~o~o~");
break;
}
}