/****
1.求偶数和
题目描述: 编制程序,输入n个整数(n从键盘输入,n>0),输出它们的偶数和。
输入: 第一行输入一个数n表示接下来输入n个数字 接下来输入n个数
输出: ?输出偶数和
样例输入: 2 1 2
样例输出: 2
*****/
#include<stdio.h>
#define N 20
void main()
{
int n,a[N],i,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]%2==0)
{
sum=sum+a[i];
}
}
printf("%d\n",sum);
}
/*****
2.二进制转化为十六进制
(拓展二进制、十进制、十六进制之间的转化全部看一下)
算法思想:将输入的二进制数每四位一组,转化为对应的十六进制数。
样例输入:
10100110
样例输出:
0xA6
****/
#include<stdio.h>
void main()
{
int binary,t,hex=0,base=1;
scanf("%d",&binary);
while(binary!=0)
{
t=binary%10;
hex=hex+base*t;
binary=binary/10;
base=base*2;
}
//printf("%x",hex);//注:代码中用到的 %X 为输出十六进制数的格式控制符。
printf("0x%X", hex); // 输出十六进制数
}
/*****
3.枚举字符串
题目描述为:定义一个枚举类型weekday,假设今天是星期二,
从键盘输入一个正整数x,计算x天后是星期几。
注:在枚举类型中,对应的数字默认从0开始递增,
也可以手动指定初始值。在本例中,TUESDAY对应的枚举变量为1。
****/
#include<stdio.h>
enum weekday {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
void main() {
int x, today = TUESDAY;
scanf("%d", &x); // 输入正整数x
int after_x_days = (today + x) % 7; // 计算x天后的枚举变量
switch (after_x_days) {
case MONDAY:
printf("Monday\n");
break;
case TUESDAY:
printf("Tuesday\n");
break;
case WEDNESDAY:
printf("Wednesday\n");
break;
case THURSDAY:
printf("Thursday\n");
break;
case FRIDAY:
printf("Friday\n");
break;
case SATURDAY:
printf("Saturday\n");
break;
case SUNDAY:
printf("Sunday\n");
break;
}
return 0;
}
/**
题目描述:定义一个枚举类型Season,其中包含四个枚举变量:SPRING、SUMMER、FALL、WINTER,分别代表春季、夏季、秋季、冬季。通过用户输入的月份,输出该月份所属的季节。
算法思想:定义Season枚举类型,将春季、夏季、秋季、冬季对应到1、2、3、4四个枚举变量上。根据输入的月份计算所属季节对应的枚举变量,将其转化为对应的季节输出。
*/
#include <stdio.h>
enum Season {SPRING = 1, SUMMER, FALL, WINTER};
int main() {
int month;
scanf("%d", &month); // 输入月份
enum Season season; // 枚举类型变量
switch (month) {
case 3:
case 4:
case 5:
season = SPRING; // 春季
break;
case 6:
case 7:
case 8:
season = SUMMER; // 夏季
break;
case 9:
case 10:
case 11:
season = FALL; // 秋季
break;
case 12:
case 1:
case 2:
season = WINTER; // 冬季
break;
default:
printf("Invalid month\n"); // 无效月份
return 0;
}
switch (season) {
case SPRING:
printf("Spring\n");
break;
case SUMMER:
printf("Summer\n");
break;
case FALL:
printf("Fall\n");
break;
case WINTER:
printf("Winter\n");
break;
}
return 0;
}
/**
4.溢出
题目描述:编写一个程序,声明一个int类型变量,将该变量初始化为一个较大的正数(如0x7fffffff),再将该变量加一,观察其结果是否溢出。
算法思想:声明一个int类型变量,并将其初始化为一个较大的正数。对该变量加一,如果结果溢出,则会变成一个较小的负数。可以通过判断变量是否小于0来判断是否溢出。
num = 2147483647
num + 1 = -2147483648
Overflow
注:int类型变量的取值范围为-2147483648 ~ 2147483647。当变量加一后超过上限,会发生溢出,变成一个负数。
**/
#include <stdio.h>
int main() {
int num = 0x7fffffff; // 初始化为一个较大的正数
printf("num = %d\n", num);
num += 1; // 加1
printf("num + 1 = %d\n", num);
if (num < 0) {
printf("Overflow\n"); // 溢出
}
else {
printf("Not overflow\n"); // 未溢出
}
return 0;
}
/*****
5.5.大整数乘法
总时间限制: 1000ms 内存限制: 65536kB
描述
求两个不超过200位的非负整数的积。
输入
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
12345678900
98765432100
样例输出
1219326311126352690000
提示
30%的数据,输入的两个整数不超过8位。
****/
#include<stdio.h>
#include<string.h>
void main()
{
char a1[201],b1[201]; //存放两个大整数的字符
int a[201],b[201],i,j,la,lb,lc; //按低位到高位存放两个大整数的数组
//int q=0;//进位
int q;
int result[401]; //result[401] = { 0 }; 乘积结果数组 ,按低位到高位存放
int t; //存放按位乘的结果
int m; //结果数组的下标
memset(result,0,sizeof(result));
gets(a1);
gets(b1);
la=strlen(a1);
lb=strlen(b1);
lc=la+lb;
for(i=0;i<la;i++) //逆序 ,按低位到高位存放两个大整数
{
a[la-i-1]=a1[i]-'0';
}
for(i=0;i<lb;i++)
{
b[lb-i-1]=b1[i]-'0';
}
for(i=0;i<la;i++) //模拟竖式相乘!!
{
q=0;//一开始相乘,进位为0 !!!!!!!,之前写错位置,结果错
m=i;
for(j=0;j<lb;j++)
{
t=a[i]*b[j]+q+result[m];
result[m]=t%10; //本位
q=t/10;
m++; //为下一次做准备
}
if(q!=0)
{
result[m]=q; //一次相乘,最后一次的进位
}
}
while(result[lc]==0 && lc>0) //一次相乘,最后一次的进位
lc--;
for(i=lc;i>=0;i--)
{
printf("%d",result[i]);
}
}
/*****
6.将大数进行因式分解
****/
#include<stdio.h>
void main()
{
long long int n,i;
scanf("%lld",&n);
//printf("%lld = \n",n);
//printf("%lld=",n);
for(i=2;i<=n;i++)//for(i=2;i<sqrt(n);i++)错
{
while(n%i==0)
{
printf("%lld",i);
n=n/i;
if(n!=1) printf("*"); //
}
}
}
/*****
7.求100之内的素数
*****/
#include<stdio.h>
#include<math.h>
void main()
{
int i,j,n=100;
for(i=2;i<=n;i++) //for(i=1;i<=n;i++)错
{
for(j=2;j<=sqrt(i);j++) //for(j=2;j<sqrt(i);j++)
{
if(i%j==0)
break;
}
if(j>sqrt(i)) //if(j>=sqrt(i))错
printf("%d ",i);
}
}
/*****
8.判断101-200之间有多少个素数,并输出所有素数
*****/
#include<stdio.h>
#include<math.h>
void main()
{
int i,j,sum=0,a[100];
for(i=101;i<=200;i++)
{
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)
break;
}
if(j>sqrt(i))
{
a[sum]=i;
sum=sum+1;
}
}
printf("%d\n",sum);
for(i=0;i<sum;i++)
printf("%d ",a[i]);
}
/*
void main()
{
int i,m;
for(m=101;m<200;m++)
{
for(i=2;i<=m-1;i++)
{
if(m%i==0)
break;
}
if(i>m-1)
printf("%d ",m);
}
}
*/
/*****
9.一个整数,它加上100后是一个完全平方数,
再加上168又是一个完全平方数,请问该数是多少?
程序分析:在10万以内判断,先将该数加上100后再开方,
再将该数加上268后再开方,如果开方后
的结果满足如下条件,即是结果。
*****/
#include<stdio.h>
#include<math.h>
#define N 100000
void main()
{
int i,x,y;
for(i=0;i<N;i++)
{
x=sqrt(i+100);
y=sqrt(i+268);
if(x*x==(i+100) && y*y==(i+268)) //!!!
printf("%d\n",i);
}
}
/*****
10.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,
其各位数字立方和等于该数本身。
例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,
每个数分解出个位,十位,百位。[重点]分解各个位上的数
*****/
#include<stdio.h>
void main()
{
int i,j,k;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
for(k=0;k<=9;k++)
{
if((i*100+j*10+k) == (i*i*i+j*j*j+k*k*k))
printf("%d ",i*100+j*10+k);
}
}
}
}