【c/c++编程】促销计算、反序数、进制转换、排版类问题、杨辉三角形、日期类问题

目录

促销计算

反序数

转进制

10 进制转 x 进制代码(x<10

10 进制转 x 进制(通用版

x 进制转 10 进制(x 为 2 时)

x 进制转 10 进制(通用版

x 进制转 y进制

排版类问题

字符棱形

解法一

解法二 

杨辉三角形

日期类问题

题目一

题目二



促销计算

题目描述

某百货公司为了促销,采用购物打折的优惠方法,每位顾客一次购物:在 1000 元以上者,按 9.5 折优惠;在 2000 以上者,按 9 折优惠;在 3000 以上者,按 8.5 折优惠;在 5000 以上者, 按 8 折优惠;编写程序,购物款数,计算并输出优惠价。

输入样例 

#: 850 1230 5000 3560

输出样例

#: discount=1,pay=850

discount=0.95,pay=1168.5

discount=0.8,pay=4000

discount=0.85,pay=3026

#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
using namespace std;
int main (){
	double a;
	scanf("%lf",&a);
	
	if (a < 1000) printf("discount = 1 , pay = %g\n" , a);
	if (a >= 1000 && a< 2000) printf("discount = 0.95,pay = %g\n" , a*0.95);
	if (a >= 2000 && a< 3000) printf("discount = 0.9,pay = %g\n" , a*0.9);
	if (a >= 3000 && a< 5000) printf("discount = 0.85,pay = %g\n" , a*0.85);
	if (a >= 5000 ) printf("discount = 0.8,pay = %g\n" , a*0.8);
	return 0;
}

反序数

  • 反序数:输入一个整数如 123,将其转换为反序之后的整数 321
#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
int main() {
	int n;
	scanf("%d", &n);
	int ans = 0;//将反序之后的答案存在这里
	
//将 n 逐位分解
	while (n > 0) {
	ans *= 10;
	ans += (n % 10);//得到个位
	n /= 10;//再缩小一位 
	}
	printf("%d\n", ans);
	return 0;
} 

转进制

  • 数位的拆解与合并,拆解很明显就是两 步,先取模然后除取整,合并就是先乘后加 

10 进制转 x 进制代码(x<10

#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
int main() {
	int n,x;//输入数n(十进制)和要转换的x进制 
	int s[105] ;
	scanf("%d%d",&n,&x) ;
	//数组下标 
	int cnt = 0; 
	
	//将n逐位分解
	while(n < 10){
		//获取数n的个位 
		int w  = (n % x);
		s[cnt++]  = w;
		//数n减少一位 
		n /= x;
	}
	//反序输出
	for(int i = cnt - 1;i>= 0;i--){
		printf("%d",s[i]);
	} 
	printf("\n");
	return 0;
} 

10 进制转 x 进制(通用版

#include<stdio.h>
#include <bits/stdc++.h>//万能头文件
int main() {
	int n,x;//输入数n(十进制)和要转换的x进制 
	char s[105] ;//十进制以上有字符,用char
	 
	scanf("%d%d",&n,&x) ;
	//数组下标 
	int cnt = 0; 
	
	//将n逐位分解
	while(n < 10){
		//获取数n的个位 
		int w  =(n % x) ;
		if(w<10) s[cnt++]  = w + '0';//转换为字符+‘0’
		//如果大于10则从A字符开始 
		else s[cnt++] = (w - 10) + 'A';//转换为小写则加‘a ’
		//数n减少一位 
		n /= x;
	}
	//反序输出
	for(int i = cnt -1;i>=0;i++){
		printf("%c",s[i]);
	} 
	
	printf("\n");
	return 0;
} 

x 进制转 10 进制(x 为 2 时)

#include<stdio.h>
#include<string.h>
int main() {
	char s[105];
	//输入二进制字符串
	scanf("%s",&s);
	int len = strlen(s);
	int ans = 0;
	for (int i = 0;i <len;i++){
		if(s[i]=='0'){
			ans = ans *2;
		} 
		else{
			ans = ans * 2 +1;
		}
	}
	
	printf("%d\n",ans);
	return 0;
} 

x 进制转 10 进制(通用版

#include<stdio.h>
#include<string.h>
int main() {
	char s[105];
	int x;
	//输入x进制字符串和代表的进制x 
	scanf("%s%d",&s,&x);
	
	int len = strlen(s);
	int ans = 0;
	
	for (int i = 0;i <len;i++){
		ans = ans * x;
		if(s[i]>='0' && s[i]<='9') ans += (s[i] - '0')
		else ans += (s[i] - 'A') + 10;
	}
	
	printf("%d\n",ans);
	return 0;
} 

x 进制转 y进制

#include<stdio.h>
#include<string.h>
int main() {
	char s[105];
	int x,y;
	//输入二进制字符串和代表的进制x  以及要转换的进制y
	 
	scanf("%s%d%d",&s,&x,&y);
	
	int len = strlen(s);
	int ans = 0;
	
	for (int i = 0;i <len;i++){
		ans = ans * x;
		if(s[i]>='0' && s[i]<='9') ans += (s[i] - '0');
		else ans += (s[i] - 'A') + 10;}
	
	char out[105];
	int cnt = 0;
	
	while(ans>0){
		int w  = ans % y;
		if (w<10) out[cnt++] = w +'0';
		else out[cnt++] = (w - 10) + 'A';
		ans /= y ;
	}
	for (int i = cnt - 1;i>=0;i--){
		printf("%c",out[i]);
	}
	printf("\n");
	return 0;
} 

排版类问题

字符棱形

  • 题目描述:

输入一个整数 n 表示棱形的对角半长度,请你用*把这个棱形画出来。

  • 输入:

3

  • 输出:

*

***

*****

***

*

  • 解题分析:

对于这类题目,可以将它进行分解。从中间切开,上面一个三角形,下面一个 三角形。问题就转化为了如何输出三角形,利用两个 for 循环控制来输出三角形 

解法一

#include<stdio.h>
#include<string.h>
int main() {
	//n 
	int n;
	scanf("%d", &n);
	//上三角
	for (int i = 1; i <= n; i++) {
		//先打印空白 
		for (int j = 1; j <= n - i; j++) {
			printf(" ");
	 }
	 //再打印* 
		for (int j = n - i + 1; j < n + i; j++) {
			printf("*");
	}
	printf("\n");
	}
	 //下三角 下三角只需要将上三角反过来输出就行
	for (int i = n - 1; i >= 1; i--) {
			//先打印空白 
		for (int j = 1; j <= n - i; j++) {
	 		printf(" ");
	 }
	 //再打印* 
		for (int j = n - i + 1; j < n + i; j++) {
			printf("*");
			}
 		printf("\n");
}
	return 0;
}
	 

解法二 

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

杨辉三角形

  • 输入描述: 输入你想输出杨辉三角形的行数 n(n<=20);当输入 0 时程序结束.
  • 输出描述: 对于每一个输入的数,输出其要求的三角形.每两个输出数中间有一个空格.每输完一个三角形换行.
  • 输入样例: 5
  • 输出样例:

  • 只需要按照题意用二维数组去计算即可。
  • 对于任意 一个数 a[i][j],都有 a[i][j] = a[i-1][j] + a[i-1][j-1]
  •  C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功

#include<stdio.h>
#include<string.h>
int main() {
	int a[21][12] = {0};
	int n;//行数 
	while(scanf("%d",&n) != EOF){
		if(n==0) break;
		a[1][1] = 1;
		for (int i = 2;i<=n;i++){//从第二行开始迭代,第一行只有一个数1
			for (int j = 1;j < i;j++){#迭代列
				a[i][j] = a[i-1][j] + a[i-1][j-1];//计算每个元素
			}
		} 
//遍历行列进行打印
		for(int i = 1;i<=n;i++){
			for (int j = 1;j < i;j++){
				printf("%d",a[i][j]);
			}
			printf("\n");
		}
		return 0;
		
	} 
}

日期类问题

题目一

题目描述:

定义一个结构体变量(包括年、月、日),编程序,要求输入年月日,计算并输出该日在本年中第几天。

输入描述:

输入三个整数(并且三个整数是合理的,既比如当输入月份的时候应该在 1 至 12 之间,不应该超过这个范围),否则输出 Input error!

输出描述:

输出一个整数.既输入的日期是本月的第几天。

输入样例:

1985 1 20

2006 3 12

输出样例:

20

71

#include<stdio.h>
#include<string.h>
struct node{
	int year,month,day ;
}p;

int f[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main() 
{
	while(scanf("%d%d%d",&p.year,&p.month,&p.day) != EOF)
	{
		
		if((p.year%4==0) ||(p.year%400==0)&&(p.year%100!=0))
		{
			f[2] = 29;
		}
		else f[2] = 28 ;
		
		int flag = 0;
		
		//判断月份
		if (p.month<1 || p.month>12) flag = 1;
		//判断天数是否合法
		for(int i = 1;i<12;i++) 
		{
			if(p.day < 0 || p.day > f[i])
			{
			flag = 1;
			}
		}
	
		if (flag) 
		{
		printf("Input error!\n");
		continue;
		 }
		 
		int ans = p.day;
		for (int i = 1; i < p.month; i++) 
		{
			ans += f[i];
		}
		printf("%d\n", ans);
		 }
		 return 0; 
		 }

题目二 

  • 题目描述 

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

  • 输入描述:
输入第一行为月份。
输入第二行为这个月的第几天。
  • 输出描述:
输入这一天是星期几。
  • 输入样例#:
5
20
  • 输出样例#:
Sunday
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<iostream>
using namespace std;
struct node{
	int year,month,day ;
}p;

int f[13] = {0,31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string s[7] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

int main()
{
	string end1;
	int ans = 0;
	
	cin>>p.month>>p.day;
	//如果是四月 
	if(p.month==4)
	{
		ans = p.day - 12;
	}
	//如果是四月以后 
	else if(p.month >=5 || p.month <=13)
	{
		for(int i = 5; i<p.month ;i++){
			ans += f[i];
		}
			ans  = p.day + 15 + ans;
			}
		int res = (ans +3)%7;
			cout<<s[res]<<end1;
		return 0;
	}
			   

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值