C/C++教程

N诺OJ刷题C&C++(P1000-P1010)

本文主要是介绍N诺OJ刷题C&C++(P1000-P1010),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

    • P1000 - A+B 问题
    • P1001 - 01 序列
    • P1002 - 数字统计
    • P1003 - 翻转数的和
    • P1005 - 博学楼的阶梯
    • P1006 - 字符串翻转
    • P1007 - 整除
    • P1008 - 0 和 1 的个数
    • P1009 - 随机数
    • P1010 - 排序


P1000 - A+B 问题

n-nuo

【题目描述】

Time Limit: 1000 ms
Memory Limit: 256 mb
输入A,B
输出A+B
-1,000,000,000<=A,B<=1,000,000,000

【输入描述】

输入包含两个整数A,B,用一个空格分隔。

【输出描述】

输出一个整数,表示A+B的值。

【输入样例】

5 8

【输出样例】

13

【代码实现】

#include <stdio.h>
int main(){
	int a,b;
	scanf("%d %d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

P1001 - 01 序列

n-nuo

【题目描述】

Time Limit: 1000 ms
Memory Limit: 256 mb
对于长度为6位的一个01串,每一位都可能是0或1,一共有64种可能。它的前几个是:
000000
000001
000010
000011
000100
请按从小到大的顺序输出这64种01串。

【输入描述】

【输出描述】

输出64行,每行一个01串。

【代码实现】

  • Example 01:
#include <stdio.h>

int main(){
	int i,temp,j;
	int a[6];
	for(i=0;i<64;i++){
		temp = i;
		for(j=0;j<6;j++){
			a[j] = temp%2;
			temp /= 2;
		}
		for(j=5;j>=0;j--){
			printf("%d",a[j]);
		}
		printf("\n");
	}
	return 0;
} 
  • Example 02:
#include <stdio.h>
void func(int n);
int main(){
	int i;
	for(i=0;i<64;i++){
		func(i);
		printf("\n");
	}
	return 0;
} 

void func(int n){
	int j;
	int a[6];
	for(j=0;j<6;j++){
		a[j] = n%2;
		n /= 2;
	}
	for(j=5;j>=0;j--){
		printf("%d",a[j]);
	}
}
  • Example 03:栈+C++
#include<iostream>
#include<stack>
using namespace std;
int main()
{
	for (int num = 0; num < 64; num++) {
		stack<int> s;
		int tmp = num;
		for (int i = 1; i <= 6; i++) {
			s.push(tmp%2);
			tmp /= 2;
		}
		while (!s.empty()) {
			cout << s.top();
			s.pop();
		}
		cout << endl;
	}
	return 0;
}
  • Example 04:求和
#include<stdio.h>
int main(){
    int i,j;     
    for(i=0;i<64;i++){
    	int res = 0;
        int temp = i;
		int cnt = 0;   
		int a[6]={0};
        while(temp>0){
            a[cnt] = temp % 2;
            temp /= 2;
            cnt++;
        }
        for(j = 5;j>=0;j--){
           res = res * 10 +a[j];
        }
        printf("%06d\n",res);
    }
    return 0;
}
  • Example 05:
#include <bits/stdc++.h>
using namespace std;

int main(){

    int A[6]={0};
    int i,j;
    
    for(i=0;i<64;i++)
    {
        printf("%d%d%d%d%d%d\n",A[0],A[1],A[2],A[3],A[4],A[5]);
        A[5]++;
        for(j=5;j>0;j--)
        {
            if(A[j] == 2)
            {
                A[j]= 0;
                A[j-1]++;
            }
        }

    }
    
    return 0;
}
  • Example 06:递归
#include<bits/stdc++.h>
using namespace std;

void Badd(char *s,int i); 

int main(){
    char s[6]={'0','0','0','0','0','0'};
    for(int i=0;i<64;i++){
        cout<<s<<endl;
        Badd(s,5);      
    }
    return 0;
}

void Badd(char *s,int i){   //二进制加法器 
    if(i==-1)return;
    if(s[i]=='0')s[i]='1';
    else{
        s[i]='0';
        return Badd(s,i-1);
    }    
}

P1002 - 数字统计

n-nuo

【题目描述】

Time Limit: 1000 ms
Memory Limit: 256 mb
请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数。
比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1次,
在数 21 中出现 1次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6次。

【输入描述】

2个正整数 L 和 R,之间用一个空格隔开。
1≤L≤R≤100000

【输出描述】

数字 2 出现的次数。

【代码实现】

#include <stdio.h>

int main(){
	int i,j,temp,count=0;
	int l,r;
	scanf("%d %d",&l,&r);//输入l,r 
	for(i=l;i<=r;i++){
		temp = i;
		while(temp>0){
			if(temp%10==2){//取个位值是否和2相等,count++ 
				count++;
			}
			temp /= 10;  
		}
	}
	printf("%d\n",count);
	
	return 0;
}

P1003 - 翻转数的和

n-nuo

【题目描述】

Time Limit: 1000 ms
Memory Limit: 256 mb
喜欢数学的Lucy经常向哥哥LF请教一些题目,哥哥总能很快就帮她解决。这不,Lucy又有难题要请教哥哥了Lucy的难题。
Lucy的难题是有关翻转数的:

翻转数就是把一个数的所有数字以相反顺序写出来,即原来的第一个数字成为最后一个,而原来的最后一个则成为第一个。我们把未翻转的数称为翻转数的原数。

例 如:6789的翻转数是9876,而6789就是9876的原数。

你一定注意到了,一个翻转数的原数可以有很多个,例如18的原数可以是81、810、8100等等。因此我们假定:通过翻转数求原数时,所求得的原数的个 位不为零。即18的原数就是81。

Lucy现在给出2个翻转数A、B。

这两个翻转数各自对应的原数是C、D,C 与D的和为 S ,Lucy想知道 S是多少?

【输入描述】

输入为多组测试数据,每行一组,包含两个整数A、B,两数中间以空格分隔,0<A<100 000 000,0<B<100 000 000。

【输出描述】

输出只有一个整数,即为S。
注意:请不要输出翻转数前面无用的零。例:对于0056,只需输出56。

【代码实现】

  • Example 01:C 语言实现
#include <stdio.h>
int reverse(int x);//函数声明 

int main(){
	int a,b;
	while((scanf("%d %d",&a,&b))!=EOF){
		int s = reverse(a) + reverse(b); 
		printf("%d\n",s);
	} 
	return 0;
}

int reverse(int x){//实现翻转函数 
	int result = 0;
	while(x){
		result = result * 10 + x % 10; //x%10表示取个位 
		x /= 10;//表示舍去个位 
	}
	return result;
} 
  • Example 02:
#include <stdio.h>
int main() {
    int a, b;
    while(~scanf("%d %d", &a, &b)) {
        int ans1 = 0, ans2 = 0;
        while(a) {
            ans1 = ans1 * 10 + a % 10;
            a /= 10;
        }
        while(b) {
            ans2 = ans2 * 10 + b % 10;
            b /= 10;
        }
        printf("%d\n", ans1 + ans2);
    }
    return 0;
}
  • Example 03:
#include<iostream>
using namespace std;
int reverse(int num)
{
	int result = 0;//翻转结果 
	while (num > 0) {
		result = result * 10 + num % 10;
		num /= 10;
	}
	return result;
}
int main()
{
	int a, b;
	while (cin >> a >> b) {//EOF结束输入
		int c = reverse(a);
		int d = reverse(b);
		cout << c + d << endl;
	}
	return 0;
}

P1005 - 博学楼的阶梯

n-nuo

【题目描述】

Time Limit: 1000 ms
Memory Limit: 256 mb
众所周知,北校区的博学楼是有11层楼,并且有三个电梯。假设电梯上升一层需要6秒,下降一层需要4秒,在每在一层停留需要3秒。电梯初始在1楼,现在给你电梯要去楼层顺序,例如3,2,5代表电梯从1楼到达三楼,再从三楼到达2楼,再从2楼到达5楼。问通过这些操作,电梯需要花多少时间?例如3,2,5,从1楼到3楼需要2 * 6秒,然后停留3秒,再从3楼到2楼需要4秒,再停留3秒,再由2楼到5楼需要3 * 6秒,停留3秒。所以总共需要2 * 6 + 3 + 4 + 3 + 3 * 6 + 3 = 43。如果上次要停留的楼层与这次相同,则只需要再停留3秒即可。

【输入描述】

输入:输入一个整数T(1 <= T <= 100),代表有T组样例。
每组样例有一个整数n(1 <= n <= 100),代表有n层楼是电梯需要去的。然后给出n个整数,给出的整数小于等于11,代表电梯到达楼层的顺序。

【输出描述】

输出:对每组样例,输出一个整数,代表今天博学楼开放教室的总数。每个输出结果后面均包含换行符。

【代码实现】

  • Example 01:
#include <stdio.h>
int func(int a[],int n);//函数声明 
int main(){
	int t,n,i;
	scanf("%d",&t);//有t组数据输入
	while(t--){
		int result = 0;//耗时
		scanf("%d",&n);//记录每组数据的个数
		int a[n];//定义数组,存放每组数据
		i = n;
		while(i--){
			scanf("%d",&a[n-1-i]);//记录现在所在楼层 
		} 
		result = func(a,n);//计算耗时	
		printf("%d\n",result);//输出result 
	}
	return 0;
}

int func(int a[],int n){
	int sum = 0,i;
	int last = 1;//定义初始楼层
	int now;//定义现在所在楼层
	for(i=0;i<n;i++){
		now = a[i];//现在所在楼层 
		if(now>last){
			sum += 3 + (now - last) * 6;//电梯往上 
		}else{
			sum += 3 + (last - now) * 4;//电梯往下 
		}
		last = now;//重新修改上一层楼层 
	}
	return sum;
}
  • Example 02:
#include <iostream>
using namespace std;

int main(){
	int m;  //接受数据的组数
	int n;  //每组数据的个数
	cin >> m;
	while(m--){
		int count = 0; //所耗时间总数
		int last = 1;  //上一次电梯所在楼层 
		int now;  //目前电梯所在楼层数
		cin >> n;
		count += 3*n;  //电梯一共要停留n次,每次3秒
		int values[n];
		int j=0;   //记录数组元素已赋值个数
		/*---开始向数组赋值---*/
		 while (cin >> now && j<n ) {
        	values[j++] = now;
        	if (cin.get() == '\n')   //遇到回车,终止
           		break;
    	}
		
		/*---开始按楼层计算运动时间---*/
		for(int i=0;i<n;i++)
		{
			now=values[i];
			if(now > last)
				count += (now - last)*6;
			else
				count +=( last- now)*4;
			last = now;
		}
		cout << count << endl;
	}
	return 0;
}
  • Example 03:
#include<iostream>
using namespace std;
int main()
{
	int T;
	cin >> T;
	while (T--) {
		int n;
		cin >> n;
		int ans = 3*n;//停留时间 
		int pre = 1, next;//之前停留的楼层,接下来要去的楼层 
		while (n--) {
			cin >> next;
			if (pre > next)
				ans += 4*(pre-next);//下降 
			else if (pre < next)
				ans += 6*(next-pre);//上升 
			//else 上次要停留的楼层与这次相同
			pre = next; 
		}
		cout << ans << endl; 
	}
	return 0;
}

P1006 - 字符串翻转

n-nuo

  • C 语言版
/*给定一个字符串,反序输出。*/

#include <stdio.h>
#include <string.h>
#define N 100

int main(){
	char s[N];
	gets(s);
	int i,len = strlen(s);
	for(i=len-1;i>=0;i--){
		printf("%c",s[i]);
	}

	return 0;
}
  • C++ 版
#include<iostream>
#include<stack>
using namespace std;
int main()
{
	string s;
	cin >> s;
	for (int i = s.length()-1; i >= 0; i--) {
		cout << s[i];
	}
	cout << endl;
	return 0;
}
  • 考虑算法版:栈的使用
#include <stdio.h>
#include <string.h>

int main()
{
    char s[100] = {'0'}, c;
    int top = 0;

    while (scanf("%c", &c) != EOF && c != '\n')
    {
        s[top] = c;
        top++;
    }

    while (top--)
    {
        printf("%c", s[top]);
    }

    return 0;
}
  • 考虑算法版:递归的使用
#include <stdio.h>

void PrintReverseString()
{
    char c;
    scanf("%c", &c);
    if ('\n' == c)
        return;
    else
    {
        PrintReverseString();
        printf("%c", c);
    }

}

int main()
{
    PrintReverseString();     
    return 0;
}

P1007 - 整除

n-nuo

  • C 语言版
/*输出100到1000之间能被5和6同时整除的数,
输出格式为每10个数为一行。相邻两个数之间用空格隔开(注意每一行末尾没有空格)*/ 

#include <stdio.h>
int main(){
	int i,cnt=0;
	for(i=100;i<=1000;i++){
		if(i%5==0&&i%6==0){
			cnt++;
			if(cnt%10==0){
				printf("%d\n",i);
			}else{
				printf("%d ",i);
			}	
		}
	}
	return 0;
}
  • C++ 版
#include <iostream>
using namespace std;
int main()
{
	int count = 1;//计数,用于控制输出格式 
	for (int num = 100; num <= 1000; num++) {
		if (num%5 == 0 && num%6 == 0) {
			if (count%10 == 0)
				cout << num << endl;
			else
				cout << num << " ";
			count++;
		}
	}
	return 0;
}

P1008 - 0 和 1 的个数

n-nuo

  • C 语言版
/*给定一个int型整数,输出这个整数的二进制的0和1的个数。
输入样例:15  输出样例:count0=28 count1=4*/ 

#include <stdio.h>
int main(){
	int n; 
	scanf("%d",&n);//输入int整数
	int cnt = 0;//定义1的个数 
	while(n > 0){
		if(n % 2){
			cnt++;//记录1的个数 
		}
		n /= 2;
	} 
	printf("count0=%d count1=%d\n",32-cnt,cnt);
	return 0;
}
  • C++ 版
#include <iostream>
using namespace std;
int main()
{
	int num;
	cin >> num;
	int count = 0;
	//int有32位,需要保证0和1的总数为32,所以只需要记录1的个数即可 
	while (num > 0) {
		if (num%2 == 1)//该二进制位为1 
			count++;
		num /= 2;
	}
	cout << "count0=" << 32-count << " count1=" << count << endl;
	return 0;
}

P1009 - 随机数

n-nuo

  • 符合题意版
/*从1—20之间随机抽取5个数,输出抽取出来的5个数之和
与剩余未被抽取的15个数之和的总和。
输入描述:无  输出描述:输出一个答案在单独的一行*/ 

#include <stdio.h>
#include <math.h>
int main(){
	int i,a[5],sum1=0,sum=0;
	for(i=0;i<5;i++){
		sum1 += rand()%20+1;
	}
	for(i=1;i<=20;i++){
		sum += i;
	}
	sum = sum - sum1 + sum1;
	printf("%d",sum);
	return 0;
} 
  • C 语言版
#include <stdio.h>
int main(){
	int sum = 0;
	int i; 
	for(i = 1; i <= 20; i++){//遍历 
		sum += i;
	}
	printf("%d\n",sum);
	return 0;
}
  • C++ 版
#include <iostream>
using namespace std;
int main()
{
	int ans = 0;
	for (int i = 1; i <= 20; i++)
		ans += i;
	cout << ans << endl;
	return 0;
}

P1010 - 排序

n-nuo

  • C 语言版:直接排序
/*输入n个数进行排序,要求先按奇偶后按从小到大的顺序排序。*/

#include <stdio.h>

void sort(int arr[], int n);

int main(){
	int n, i;
	int a[1000];
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}	
	sort(a, n);//升序排序 
	for(i = 0; i < n; i++){//输出奇数 
		if(a[i] % 2){
			printf("%d ",a[i]);
		}
	}
	for(i = 0; i < n; i++){//输出偶数 
		if(a[i] % 2 == 0){
			printf("%d ",a[i]);
		}
	}
	printf("\n");
	return 0; 
} 

void sort(int arr[], int n){//升序排序 
	int i, j, k, tmp;
	for(i = 0; i < n - 1; i++){
		k = i;
		for(j = i + 1; j < n; j++){
			if(arr[j] < arr[k]){
				tmp = arr[k];
				arr[k] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}
  • C 语言版:冒泡排序
/*输入n个数进行排序,要求先按奇偶后按从小到大的顺序排序。*/

#include <stdio.h>

void sort(int arr[], int n);

int main(){
	int n, i;
	int a[1000];
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}	
	sort(a, n);//升序排序 
	for(i = 0; i < n; i++){//输出奇数 
		if(a[i] % 2){
			printf("%d ",a[i]);
		}
	}
	for(i = 0; i < n; i++){//输出偶数 
		if(a[i] % 2 == 0){
			printf("%d ",a[i]);
		}
	}
	printf("\n");
	return 0; 
} 

void sort(int arr[], int n){//升序排序 
	int i, j, tmp;
	for(i = 0; i < n - 1; i++){
		for(j = 0; j < n - 1 - i; j++){
			if(arr[j] > arr[j + 1]){
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
  • C++ 版
#include <bits/stdc++.h> //万能头文件 
using namespace std;

bool cmp(int a,int b){
    if(a%2==b%2){//若同奇同偶 
        return a<b;//直接从小到大排序 
    }else{
        return (a%2) > (b%2);//奇数在偶数前 
    } 
} 

int main(){
    int n;
    int a[1005] = {0};
    cin >> n;
    for(int i=0;i<n;i++){
        cin >> a[i];
    } 
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}
这篇关于N诺OJ刷题C&C++(P1000-P1010)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!