P1011 - 日期

n-nuo

【题目】

今天是2012年4月12日星期四,编写程序,
输入今天开始到12月31日之间的任意日期,输出那一天是星期几。
例如输入“5(回车)20(回车)”(5月20日),
输出应为“Sunday”。

【代码】

  • C 语言版:使用二维数组 (字符数组)
#include<stdio.h>
int main(){
	int m[]={0,30,31,30,31,31,30,31,30},mon,day,week,i,sum=0;
	char Eweek[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//字符数组真的忘完了
	scanf("%d",&mon);
	scanf("%d",&day);
	for(i=5;i<=mon;i++)
	    sum+=m[i-4];
	week=(sum+day-12+4)%7;
	printf("%s",Eweek[week]);
    return 0;
}
  • C 语言版:使用 switch
#include<stdio.h>
int main()
{
    int month, day, sum=0;
    int mon[13] = {0,0,0,0,30,31,30,31,31,30,31,30,31};//从4月开始,1,2,3不用算 
    scanf("%d", &month);
    scanf("%d", &day);
    int i;
    for(i = 4; i < month; i++)
    {
        sum += mon[i];
    }
    sum += day - 12;//总天数 
    switch(sum % 7)
    {
         case 0:printf("Thurstay");break;
         case 1:printf("Friday");break;
         case 2:printf("Saturday");break;
         case 3:printf("Sunday");break;
         case 4:printf("Monday");break;
         case 5:printf("Tuesday");break;
         case 6:printf("Wednesday");break;
    }
    printf("\n");
    return 0;
}
  • C++ 版
#include<iostream>
using namespace std;
int days[] = {0, 30, 31, 30, 31, 31, 30, 31, 30, 31};//4月之后每月的天数,第一个元素为0便于计数 
string week[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int cal_days(int y, int d)
{
	//计算该日期与4月12相隔的天数 
	int num = 0;
	for (int i = 0; i <= y-4; i++)
		num += days[i];
	num += d;
	num -= 12;
	return num;
}
int main()
{
	int ans = 4;
	int y, d;
	cin >> y >> d;
	ans += cal_days(y, d);
	ans %= 7;//计算星期 
	cout << week[ans] << endl;
	return 0;
}

P1012 - 字符移动

n-nuo

【题目】

输入一个字符串,将其中的数字字符移动到非数字字符之后,
并保持数字字符和非数字字符输入时的顺序。
例如:输入字符串“ab4f35gr#a6”,输出为“abfgr#a4356”。

【代码】

  • C 语言版:最初思路
#include <stdio.h>
#include <string.h>

int main(){
	char a[100], b[100], tmp[100];
	scanf("%s", a);
	int i, cnt_tmp = 0, cnt = 0;
	for(i = 0; i < strlen(a); i++){
		if(a[i] >= '0' && a[i] <= '9'){
			tmp[cnt_tmp++] = a[i];
		}else{
			b[cnt++] = a[i];
		}
	}
	for(i = cnt; i < cnt + cnt_tmp; i++){
		b[i] = tmp[i - cnt];
	}
	puts(b);
	
	return 0;
}
  • C 语言版:完善
#include <stdio.h>
#include <string.h>

int main(){
	static char a[101], b[101];
	gets(a);
	int i, cnt = 0;
	for (i = 0; a[i] != '\0'; i++){
		if (a[i] < '0' || a[i] > '9'){
			b[cnt++] = a[i];
		}
	}
	for (i = 0; a[i] != '\0'; i++){
		if (a[i] >= '0' && a[i] <= '9'){
			b[cnt++] = a[i];
		}
	}
	puts(b);
	
	return 0;
}
  • C++ 版:string 类型有个好处就是可以直接做加法
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s, s1 = "", s2 = "";//保存完整字符串、字符、数字 
	cin >> s;
	for (int i = 0; i < s.length(); i++) {
		if (s[i] >= '0' && s[i] <= '9')
			s2 += s[i];
		else
			s1 += s[i];
	}
	cout << s1 << s2 << endl;
    // cout << s2 + s1;
	return 0;
}

P1013 - 判断素数

n-nuo

【题目】

输入一个整数,判断该整数是否为素数,
若是,输出该整数,
若否,输出大于该整数的第一个素数。
(例如,输入为14,输出17,因为17是大于14的第一个素数)

【代码】

  • C 语言版:初版
#include <stdio.h>
#include <math.h>

int isPrime(int x);//声明函数,判断是否为素数 

int main(){
	int x, i;
	scanf("%d", &x);
	for (i = x; ; i++){
		if (isPrime(i)){
			break;
		} 
	} 
	printf("%d\n",i);
}

int isPrime(int x){
    int result = 1;
    int i;
    if(x == 1 || (x%2 == 0 && x != 2)){
        result = 0;
    }
    for(i=3;i<sqrt(x);i+=2){
        if(x%i == 0){
            result = 0;
            break;
        }
    }
    return result;
}
  • C 语言版:简化变量
#include <stdio.h>
#include <math.h>

int isPrime(int x);//声明函数,判断是否为素数 

int main(){
	int x;
	scanf("%d", &x);
	while(!isPrime(x)){
		x++;
	}
	printf("%d\n",x);
}

int isPrime(int x){
    int result = 1;
    int i;
    if(x == 1 || (x%2 == 0 && x != 2)){
        result = 0;
    }
    for(i=3;i<sqrt(x);i+=2){
        if(x%i == 0){
            result = 0;
            break;
        }
    }
    return result;
}
  • C++ 版
#include<iostream>
using namespace std;
bool fun(int num)
{
	//判断num是否是素数 
	if (num == 1)//1不是素数 
		return false;
	for (int i = 2; i < num; i++) {
		if (num%i == 0)
			return false;
	}
	return true;
}
int main()
{
	int num;
	cin >> num;
	while(!fun(num))	//找素数 
		num++;
	cout << num << endl;
	return 0;
}

P1014 - 加密算法

n-nuo

【题目】

题目描述:
编写加密程序,加密规则为:
将所有字母转化为该字母后的第三个字母,
即A->D、B->E、C->F、......、Y->B、Z->C。小写字母同上,其他字符不做转化。
输入任意字符串,输出加密后的结果。
例如:输入"Ilove007",输出"Loryh007"
    
输入描述:输入一行字符串,长度小于100。
    
输出描述:输出加密之后的结果。
    
输入样例#:Ilove007
    
输出样例#:Loryh007

【代码实现】

  • C 语言版
#include <stdio.h>
#include <string.h>

int main(){
	char s[105];
	gets(s);
	int i;
	for(i = 0; i < strlen(s); i++){
		if(s[i] >= 'A' && s[i] <= 'Z'){
			s[i] += 3;
			if(s[i] > 'Z'){
				s[i] -= 26;//溢出循环 
			}
		}else if(s[i] >= 'a' && s[i] <= 'z'){
			s[i] += 3;
			if(s[i] > 'z'){
				s[i] -= 26;//溢出循环 
			}
		} else{
			continue;
		} 
	}
	puts(s);
	return 0;
}
  • C++ 版
#include<iostream>
#include<cstring>
using namespace std;
const int M = 1024;
int main()
{
	char line[M], ans[M];
	cin.getline(line, M);
	int i = 0;
	while (line[i]) {
		if (line[i] >= 'A' && line[i] <= 'Z')
			ans[i] = 'A' + (line[i] + 3 - 'A')%26;
		else if (line[i] >= 'a' && line[i] <= 'z')
			ans[i] = 'a' + (line[i] + 3 - 'a')%26;
		else
			ans[i] = line[i];
		i++;
	}
	ans[i] = '\0';
	cout << ans << endl;
	return 0;
}

P1015 - 单链表

n-nuo

【题目】

设节点定义如下

struct Node {
    int Element; // 节点中的元素为整数类型
    struct Node * Next; // 指向下一个节点
};

从键盘输入5个整数,将这些整数插入到一个链表中,并按从小到大次序排列,最后输出这些整数。

【代码实现】

  • C 语言版
#include <stdio.h>
#include <stdlib.h>

struct Node {
    int Element; // 节点中的元素为整数类型
    struct Node * Next; // 指向下一个节点
};

int main(){
	struct Node *head,*p,*q;
	head = (struct Node *)malloc(sizeof(struct Node));
	head->Next = NULL;
	int number, i;
	for(i = 0; i < 5; i++){
		scanf("%d",&number);
		p = head;
		while(p->Next && p->Next->Element < number){
			p = p->Next;
		}
		q = (struct Node *)malloc(sizeof(struct Node));
		//将节点插入
		q->Element = number;
		q->Next = p->Next;
		p->Next = q; 
	}
	p = head->Next;
	while(p->Next){
		printf("%d ",p->Element);
		p = p->Next;
	}
	printf("%d",p->Element);
	return 0;
} 
  • C++ 版
#include<iostream>
using namespace std;
struct Node {
    int Element; // 节点中的元素为整数类型
    struct Node * Next; // 指向下一个节点
};
int main()
{
	struct Node* head = new struct Node;
	struct Node *p, *q;
	head->Next = NULL;
	int num;
	for (int i = 0; i < 5; i++) {
		cin >> num;
		p = head;
		while (p->Next != NULL && p->Next->Element < num)//找到合适的插入位置
			p = p->Next;
		q = new struct Node;
        //将节点插入相应位置
		q->Element = num;
		q->Next = p->Next;
		p->Next = q;
	}
	p = head->Next;
	while (p->Next) {
		cout << p->Element << " ";
		p = p->Next;
	}
	cout << p->Element << endl;
	return 0;
}

P1016 - 字符分类

n-nuo

【题目】

从键盘上输入一个字符串,将该字符串分为数字、字母、其他字符三个部分输出。

例如:
输入:Thdad29#@12aH;77
输出:
ThdadaH
291277
#@;

【代码实现】

  • C 语言版
#include <stdio.h>
#define N 100 

int main(){
	char s[N];
	char a[N], b[N], c[N];
	int cnt_a = 0, cnt_b = 0, cnt_c = 0;
	int i;
	gets(s);
	for(i = 0; s[i] != '\0'; i++){
		if(s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z'){
			a[cnt_a++] = s[i];
		}else if(s[i] >= '0' && s[i] <= '9'){
			b[cnt_b++] = s[i];
		}else{
			c[cnt_c++] = s[i];
		}		
	}
	puts(a);
	puts(b);
	puts(c);
	
	return 0;
}
  • C++ 版
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	string sstr = "", snum = "", sother = "";//存字符、数字和其他字符 
	cin >> s;
	for (int i = 0; i < s.length(); i++) {
		if (s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z')
			sstr += s[i];
		else if (s[i] >= '0' && s[i] <= '9')
			snum += s[i];
		else
			sother += s[i];
	}
	cout << sstr << endl;
	cout << snum << endl;
	cout << sother << endl;
	return 0;
}

P1017 - 幂次方

n-nuo

【题目描述】

对任意正整数 N,求 X ^ N % 233333 的值。

【解题思路】

这道题关键的地方就是 x 和 n 的数据类型:long long

  • C 解答:
#include <stdio.h>
/*
* @author:wugenqiang
*/
int main(){
    long long x, n, sum = 1;
    scanf("%lld %lld", &x, &n);
    while (n > 0) {
    	if (n % 2 == 1) {
    		sum = sum * x % 233333;
		}
		x = x * x % 233333;
		n /= 2;
	}
	printf("%lld\n", sum);
    return 0;
}

P1018 - 击鼓传花

n-nuo

【题目描述】

有 N 个小朋友围成一圈玩击鼓传花游戏,将小朋友编号为 1 ~ N,从 1 号开始传花,每次传 3 个,拿到花的小朋友表演节目后退出,任给 N,问最后一个表演的小朋友编号是多少?

【解题思路】

建立链表实现

  • C 解答:
#include <stdio.h>
#include <stdlib.h>
/*
* @author:wugenqiang
*/
typedef struct node {
	int num;
	struct Node *next;
}Node; 
int main() {
	int n;
	scanf("%d", &n);
	Node *pre = (Node *)malloc(sizeof(Node));
	Node *head = (Node *)malloc(sizeof(Node)); 
	pre = head;
	int i;
	for (i = 1; i <= n; i++) {
		Node *p = (Node *)malloc(sizeof(Node));
		p->num = i;
		pre->next = p;
		pre = pre->next;
	}
    pre->next = head->next;
    //删除节点
	while (n != 1) {
		for (i = 0; i < 2; i++) {
			head = head->next;
		}
		Node *temp = head->next;
		head->next = temp->next;
		free(temp);
		n--;
	} 
	printf("%d\n", head->num);
    return 0;
}
  • C++ 解答:
//#include <bits/stdc++.h>
#include<iostream>
#include<cstdlib>
using namespace std;

typedef struct Node{
	int number;
	struct Node* next;
}LNode;

int main()
{
	int n;
	cin >> n;
	LNode *head, *p, *pre = NULL;
	p = head = new LNode;
	for (int i = 1; i < n; i++) {
		p->number = i;
		p->next = new LNode;
		p = p->next;
	}
	p->number = n;
	p->next = head;//形成循环链表 
	//开始击鼓传花 
	p = head;
	int count = 1;//计数 
	while (p->next != p) {
		if (count % 3 == 0) {
			//出链表 
			pre->next = p->next;
			free(p);
			p = pre;
		}
		count++;
		pre = p;
		p = p->next;
	}
	cout << p->number << endl;
	return 0;
}

vector 模拟环形链表实现

  • C++ 解答:
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    while(~scanf("%d", &n)) {
        vector<int> v;
        for(int i = 1; i <= n; i++)
            v.push_back(i);

        for(int i = 2; v.size() != 1; i = (i + 3 - 1) % v.size()) {
            v.erase(v.begin() + i);
        }

        printf("%d\n", v[0]);
    }
}

P1019 - 字母频率

n-nuo

【题目描述】

从键盘输入一个字符串(可能含有数字、字母、其他可见字符),输出出现频率最高的英文字母及次数,忽略字母的大小写(如大写 A 和小写 a 均视为 a )。

【解题思路】

  • C 解答:
#include <stdio.h>
#include <string.h>

int main(){
	int a[26] = {0};
	char s[1000];
	gets(s);
	int i;
	for (i = 0; i < strlen(s); i++){
		if ('A' <= s[i] && s[i] <= 'Z')
			a[s[i] - 'A']++;
		else if ('a' <= s[i] && s[i] <= 'z')
			a[s[i] - 'a']++;
	}
	int max = 0, maxi;
	for (i = 0; i < 26; i++) {
		if (a[i] > max) {
			max = a[i];
			maxi = i;
		}	
	}
	printf("%c %d\n", ('a' + maxi), max);
	return 0;
}

读取整行用的 getline,获得最大值用的 “打擂台法”

  • C++ 解答:
//#include <bits/stdc++.h>
#include<string>//getline
#include<iostream>
using namespace std;
int a[26];
int main(){
	string s;
	getline(cin, s);
	for (int i = 0; i < s.length(); i++){
		if ('A' <= s[i] && s[i] <= 'Z')
			a[s[i] - 'A']++;
		else if ('a' <= s[i] && s[i] <= 'z')
			a[s[i] - 'a']++;
	}
	int max = 0, maxi;
	for (int i = 0; i < 26; i++) {
		if (a[i] > max) {
			max = a[i];
			maxi = i;
		}	
	}
	cout << char(maxi + 'a') << " " << max;
	return 0;
}

P1020 - 最长连续因子

题目地址

【题目描述】

输入一个整数,输出其最长连续因子。

【解题思路】

  • C 解答:
#include <stdio.h>

int main(){
	int n;
	scanf("%d", &n);//输入一个整数N,N<=10000。
	int factorMax = 0;
	int i, j, index;
	for (i = 2; i < n; i++) {
		if (n % i == 0) {
			int cnt = 1;
			for (j = i + 1; j < n; j++) {
				if (n % j == 0) {
					cnt++;
				} else {
					break;
				}
			}
			if (cnt > factorMax) {
				index = i;
				factorMax = cnt;
			}
		}
	}
	for (i = index; i < index + factorMax; i++) {
		printf("%d ", i);
	}
	 
	return 0;
}
  • C++ 解答:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int num;
	cin >> num;
	vector<int> factor;
	for (int i = 2; i <= num; i++)//存储因子 
		if (num%i == 0)
			factor.push_back(i);
	int* dp = new int[factor.size()];
	dp[0] = 1;
	for (int i = 1; i < factor.size(); i++) {
		if (factor[i] == factor[i-1]+1)
			dp[i] = dp[i-1] + 1;
		else
			dp[i] = 1;
	}
	int index = 0;
	for (int i = 1; i < factor.size(); i++) {
		if (dp[i] > dp[index])
			index = i;
	}
	for (int i = index-dp[index]+1; i < index; i++)
		cout << factor[i] << " ";
	cout << factor[index] << endl;
	return 0;
}