大一寒假算法题

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. 企业发放的奖金根据利润提成。

利润:

  1. 低于或等于10万元时,奖金可提10%;
  2. 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
  3. 20万到40万之间时,高于20万元的部分,可提成5%;
  4. 40万到60万之间时高于40万元的部分,可提成3%;
  5. 60万到100万之间时,高于60万元的部分,可提成1.5%;
  6. 高于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 排序算法

  1. 冒泡排序
#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;	
} 
  1. 选择法排序
#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;	
} 
  1. 插入法排序
#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;	
} 
  1. 归并排序
#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;
        }
    }
发布了108 篇原创文章 · 获赞 114 · 访问量 8576

猜你喜欢

转载自blog.csdn.net/weixin_45773503/article/details/104029918