第一周作业
【练习1】HelloWorld
让我们学习用C语言向世界问好。
“Hello World”示例程序最早出现于1972年,由贝尔实验室成员Brian Kernighan撰写的内部技术文件《Introduction to the Language B》之中。不久同作者于1974年所撰写的《Programming in C: A Tutorial》,也延用这个示例。
一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。将“Hello World”作为第一个示范程序,已经成为编程语言学习的传统。
我们在这里继续传统,这也是一种向前辈们致敬的方式之一吧!
最早的程序基本是这个样子的:
#include <stdio.h>int main(){ printf("Hello world.\n"); return 0;}
请模仿上面的程序,看看是否可以通过编译?如果你能通过这个简单的程序,那就让我们继续完成后面的习题吧。
略
第二周作业
【练习2】学学scanf和printf的用法吧
该如何处理 double 型的数据:如何定义变量类型?如何使用 scanf 函数?
如果已知圆柱的底面半径 r ,以及高 h ,则可计算出圆柱的侧面积 s=2 π r h ,体积 v=π r 2 h 。其中 π=3.1415926。
输入: 第一行输入圆柱的底面半径 r第二行输入圆柱的高 h
输出: s=< 圆柱的侧面积 >,v=< 圆柱的体积 >
要求 1. 所有变量都定义为双精度类型2. 结果精确到小数点后两位。
作为练习题目:
我们已经给您编写好了大部分的代码,请您自己修改几个地方,完成程序的剩余部分。
**********************************************分隔线************
#include
**********************************************分隔线************
Code:
#include
#define PAI 3.1415926
int main()
{
int r,h;
double s,v;
scanf("%d %d",&r,&h);
s=2*PAI*r*h;
v=PAI*r*r*h;
printf("s=%.2f,v=%.2f\n",s,v);
return 0;
}
第三周作业
1、输出字符的 ASCII 码
背景:
我们在计算机基础中已经学过:字母在计算机中采用ASCII码进行存储。下面要从键盘上输入任意一个字符,然后输出该字符对应的ASCII码。
输入:
一个字符
输出:
该字符对应的ASCII码
Code:
#include
int main()
{
char ch;
scanf("%c",&ch);
printf("The ASCII of character '%c' is %d.",ch,ch);
return 0;
}
输入: 接受两个整数,每个整数之间使用空格分隔。例如输入格式为:123 444
输出: 分别输出按照整型数据进行 +、-、*、/、* 之后的运行结果。
Code
#include
int main()
{
int a, b;
char ch = 37;
scanf("%d%d",&a,&b);
printf("%d+%d=%d\n",a,b,a + b);
printf("%d-%d=%d\n",a,b,a - b);
printf("%d*%d=%d\n",a,b,a * b);
printf("%d/%d=%d\n",a,b,a / b);
printf("%d%c%d=%d\n",a,ch,b,a % b);
return 0;
}
3、判断三角形的形状
要求
输入三角型的三条边,判断三角形的形状。假设输入的三边边长均>0。
输入:
三角型的3条边的长度(int型)。
输出:
等边三角形:equilateral triangle等腰三角形:isoceles triangle不构成三角形:non-triangle一般三角形:triangle
Code
#include
int main()
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
if(a + b > c && a + c > b && b + c >a)
{
if(a == b && a == c && b == c)
{
printf("equilateral triangle.\n");
return 0;
}
if(a == b || a == c || b == c)
{
printf("isoceles triangle.\n");
return 0;
}
printf("triangle.\n");
}
else
{
printf("non-triangle.\n");
}
return 0;
}
第四周作业
1.【中学】计算时钟的夹角
背景:钟面上的时针和分针之间的夹角总是在 0 ~180之间 ( 包括 0 和180 ) 。举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为180 ,在三点的时候为90 。本题要解决的是计算 12:00 到 11:59 之间任意一个时间的夹角。
输入:
每组测试数据包含两个数字:第一个数字代表小时 ( 大于 0 小于等于 12) ,第二个数字代表分 ( 在区间 [0, 59] 上 ) 。
输出:
对应每组测试数据,用常用格式显示时间以及这个时候时针和分针间的最小夹角,精确到小数点后一位。输出格式如下所示。
再看一看,想一想:是否可以不用if 语句,只使用 printf 函数来简化你的程序?
o Code
#include
int main()
{
int hour, minute, temp;
float angle, h_angle, m_angle;
scanf("%d%d",&hour,&minute);
temp = hour;
if(hour == 12) temp = 0;
h_angle = temp * 30.0 + minute * 0.5;
m_angle = minute * 6.0;
angle = h_angle > m_angle ? h_angle - m_angle : m_angle - h_angle;
if(angle > 180.0) angle = 360.0 - angle;
printf("At %d:%02d the angle is %.1f degrees.\n",hour,minute,angle);
return 0;
}
母亲节是每年的五月第二个星期天,针对输入的年份,计算该年的哪一天是母亲节。
输入:
年份
输出:
日期(5月的哪一天)
给出任意一个年月日(年>1900),现在我们不能只是直接计算,要先判断给出的日期是否合法,对于非法的日期要给出错误提示信息,合法的日期要再计算是星期几。
输入:
年 月 日
输出:
0~6。 星期日用 0 表示,星期一用 1 表示,星期二用 2 表示......星期六用 6 表示。
假设年份大于1900。先想一想:我们现在只会使用 if 语句,该如何建立数学模型?
Code:
#include
小明在中学会求一个数的 n 次方了,但计算机还不会,请你来编写一个程序吧。由于计算机比较“笨”,所以我们编写程序的功能不用太强,只要能算出 a 的 n 次方的最后 3 位数就可以了。
输入:
a 和 n 的值。假设 a<=150 。
输出:
求 a 的 n 次方的最后 3 位数。
提示:再想一想,你的方法对吗?你用的是什么数据类型?
o Code:
#include
int main()
{int a,b,d,c=1;
scanf("%d%d",&a,&b);
if(b==0)
c=1;
for(d=1;d<=b;d++)
{
c*=a;
c=c%1000;}
if(c==0)
printf("The last 3 numbers is 000.\n");
else
{
printf("The last 3 numbers is %d.",c);
return 0;}
}第五周作业
1.锻炼身体吧
题目描述:
沫沫,灰灰和渣渣去锻炼身体,如果对他们跑步的距离分别只计整数 a、 b、 c,由于他们身高的差距,造成了 a<=b<=c,并且渣渣跑了N米之后就再也跑不动了。但是,按照他们事先的约定: 只有当 c*c==a*a+b*b 时,他们的锻炼才有效果。
现在他们三个人想知道,如果渣渣的极限N已知,那么有多少种有锻炼效果的跑步方案(即a, b, c有多少种可能的取值)。
输入:
一个整数N,表示渣渣的体力极限, N <= 5000。
输出:
一个整数,代表他们跑步方案的个数。
Hint:对于输入N=5,有方案 a=3, b=4, c=5, 共一种。
Code:
#include
int main()
{
int a = 1,b = 1,c = 1,maxnum,count = 0;
scanf("%d",&maxnum);
for(c = 1;c <= maxnum;c++)
{
for(a = 1; a < c; a++ )
{
for(b = 1; b < c; b++)
{
if((c*c == a*a +b*b)&&(a <= b)) count++;
}
}
}
printf("%d\n",count);
return 0;
}
2.寻找特殊偶数
背景
有一种特殊偶数,它每一位上的数字都两两不相同。我们现在需要找出四位数中某一区间内的这类偶数。
输入
所要寻找的四位偶数的范围。每组输入有两个数字:第一个数字是最小范围;第二个数字是最大范围。如果输入遇到0,输入结束。
输出
列出此范围内的所有特殊偶数,并且列出此范围内特殊偶数的个数。
Code:
#include
int main()
{
int maxnum, minnum, n, g, s, b, q, count = 0;
while(1){
scanf("%d%d",&minnum,&maxnum);
if(minnum == 0 && maxnum == 0) return 0;
if((minnum > 999 && minnum < 10000) && (maxnum > 999 && maxnum < 10000) && (maxnum >= minnum))
{
for(n = minnum; n <= maxnum; n++)
{
if(n % 2 == 0){
q = n / 1000;
b = n % 1000 / 100;
s = n % 100 / 10;
g = n % 10;
if(q != b && q != s && q != g && b != s && b != g && s != g)
{
count++;
printf("%d ",n);
}
}
}
printf("\n");
printf("counter=%d\n",count);
count = 0;
}
else
printf("Error\n");
}
return 0;
}
3.求最小 m 值
求满足下列不等式的最小 m。
1 + 2 + 3 + 4 + ...... + m ≥ n
例如:n=100,当 m =14 时,满足:1+2+3+4+...+13=91<100,而 1+2+3+4+......+14=105>100。
输入:n
输出:m
Code:
#include
int main()
{
int max, i = 0, sum = 0;
scanf("%d",&max);
while(sum < max)
{
i++;
sum += i;
}
printf("%d\n",i);
}
第六周作业
数字正方型
这是双重循环的入门题目,大家来看看,你会做吗?
输入 n 的值,输出如下例( n=4 )所示的由数字组成的正方型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
输入: n
输出: 数字组成的正方型
Code
#include
int main()
{
int n, x, y, count = 0;
scanf("%d",&n);
for(y = 0; y < n; y++)
{
for(x = 0; x < n; x++)
{
count++;
printf("%3d",count);
}
printf("\n");
}
return 0;
}
空心字符菱形
输入:
菱型起始字母和菱形的高度。
输出:
参看测试用例,打印空心的由字符组成的菱形。
Code:
#include
int main()
{
int n, i, q, p;
char ch;
scanf("%c%d",&ch,&n);
for(i = 0; i < n; i++)
{
for(q = i; q < n - 1; q++)
printf(" ");
printf("%c",ch + i);
for(q = 0; q < (2 * i - 1); q++)
{
printf(" ");
if(q == 2 * i - 2)
printf("%c",ch + i);
}
printf("\n");
}
for(i = n - 2; i >= 0; i--)
{
for(q = i; q < n - 1; q++)
printf(" ");
printf("%c", ch + i);
for(q = 2 * i - 1; q > 0; q--)
{
printf(" ");
if(q == 1)
printf("%c", ch + i);
}
printf("\n");
}
return 0;
}
邮票组合
背景: 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或几张的组合,可以满足不同邮件的不同的邮资。 现在,邮局有4种不同面值的邮票。在每个信封上最多能贴5张邮票,面值可相同,可不同。
输入: 四种邮票的面值。
输出: 用这四种面值组成的邮资最大的从1开始的一个连续的区间。
说明: 如结果为10,则表明使用4张邮票可组合出1、2、3、4、5、6、7、8、9、10这些邮资。
名词解释: 邮资:就是你寄东西需要花多少钱。 邮票面额:是由国家发行的具有固定价格的花纸片,被称为邮票。
如果你寄东西,邮局称了重量,告诉你要240分。这样你就要贴邮票了。如果现在邮局的邮票有面值为80分、50分、20分和10分的四种,你就可以采用不同的组合得到240的邮资,例如:采用3张80分的可以凑出240分;或者24张10分的凑起来240分也可以。显然不同邮票的组合都可以得到同样一种邮资。
Code:
#include
int main()
{
int i[5],t[3126],n,n1,n2,n3,n4,temp = 0;
i[0] = 0;
for(n = 1; n < 5; n++)
scanf("%d",&i[n]);
for(n = 0; n < 3126; n++)
t[n] = 0;
for(n = 0; n < 5; n++)
{
for(n1 = 0; n1 < 5; n1++)
{
for(n2 = 0; n2 < 5; n2++)
{
for(n3 = 0; n3 < 5; n3++)
{
for(n4 = 0; n4 < 5; n4++)
{
t[temp] = i[n] + i[n1] + i[n2] + i[n3] + i[n4];
temp++;
}
}
}
}
}
for(n = 0; n < 3124; n++)
{
for(n1 = n; n1 < 3125; n1++)
{
if(t[n] > t[n1])
{
temp = t[n];
t[n] = t[n1];
t[n1] = temp;
}
}
}
temp = 0;
for(n = 0; n < 3125; n++)
{
if(t[n] < t[n + 1] )
temp++;
if(temp != t[n + 1])
break;
}
printf("The max is %d.\n",temp - 1);
return 0;
}
火锅火锅和火锅(10分)
题目内容:
众所周知,沫沫以火锅为生。在E8的聚餐活动中,他经常卖萌卖无辜领着大家吃火锅。。
有一天,沫沫听说学校附近的哺呷哺呷在某现充的赞助下有一个优惠活动,只需30软妹币,对每个客人,它会上N道菜,但是客人只能挑选其中连续上的一些菜。
于是他非常兴奋的拉着灰灰和渣渣去吃火锅去啦。
沫沫是一个十分挑食的人,所以他对每一道菜都有一个愉快度(当然因为他的挑食,某些事物的愉快度会是负数)。
为了让沫沫能非常愉快的享受这次聚餐,善解人意的灰灰和渣渣决定帮他计算,他们应该怎么选择菜才能使沫沫最开心地吃完这次聚餐。
输入格式:
第一行是一个整数T,(T <= 10)表示测试案例的个数
对于每个测试案例,第一行是一个整数N,( 1<=N <= 10000)表示菜的个数
接下来的N个数字,第i个数字si表示沫沫对第i道菜的愉快度。( -1000 <=si <= 1000)
PS:由于CF又被血虐掉rating,所以沫沫的起始愉快度是0
PPS:沫沫完全可能得到一个为负值的愉快值, poor 沫沫。。
输出格式:
对于每个样例,输出一个数字,表示沫沫吃完之后愉快度的最大值。
HINT:
对于 5
6 -1 5 4 -7
我们选择6, -1, 5, 4这四道菜(注意必须是连续的,所以不能跳过-1)
做完后请思考,如果N的范围是1<=N<=100000呢?
输入样例:
2
5
6 -1 5 4 -7
7
0 6 -1 1 -6 7 -5
输出样例:
14
7
时间限制:500ms内存限制:32000kb
Code:
#include
#include
#include
int main()
{ int i,j,k,n,t,sum,len,maxl;
scanf("%d",&t);
while(t--)
{scanf("%d",&n);
sum=len=0;
maxl=-1001;//maxl小于愉快度可能的最小值
while(n--)
{
scanf("%d",&k);
if(maxl
len=len+k>0?len+k:0;
if(sum
}
if(maxl<0) printf("%d\n",maxl);
else printf("%d\n",sum);
}
return 0;}
有一组整数,要将它们从小到大排序,去掉其中重复的数值。
输入:
第1行,输入整数N,表明接下来将有N(<=100)个整数读入。
第2~N行,输入N个这个数。
输出:排序后的整数(去掉重复的数值)
例如:
输入:
3(回车)
7 5 7(回车)
输出:5 7(回车)
Code:
#include
int main()
{
int n, m, l, i[100], temp;
scanf("%d",&n);
for(m = 0; m < n; m++)
scanf("%d",&i[m]);
for(m = 0; m < n - 1; m++)
for(l = m + 1; l < n; l++)
{
if(i[m] > i[l])
{
temp = i[m];
i[m] = i[l];
i[l] = temp;
}
}
printf("%d",i[0]);
temp = i[0];
for(m = 1; m < n; m++)
{
if(temp < i[m])
{
printf(" %d",i[m]);
temp = i[m];
}
}
printf("\n");
}
第八周作业
1.单词排序
输入 5 个单词,将它们按从大到小的顺序排列后输出。
输入:
5个单词
输出:
排序后的顺序
Code:
#include
#include
int main()
{
char s[5][100], t[100];
int i, n;
for(i = 0; i < 5; i++)
scanf("%s",s[i]);
for(i = 0; i < 4; i++)
{
for(n = i + 1; n < 5; n++)
{
if(strcmp(s[i],s[n]) < 0)
{
strcpy(t,s[i]);
strcpy(s[i],s[n]);
strcpy(s[n],t);
}
}
}
for(i = 0; i < 5; i++)
printf("%s\n",s[i]);
return 0;
}
2.寻找矩阵的鞍点
二维数组中的鞍点,即该位置上的元素是所在行上的最大值,是所在列上的最小值。
二维数组也可能没有鞍点。
输入一个二维数组的行数n,列数m,二维数组的诸元素值;输出数组的鞍点,以及鞍点所在的行列号。
输入:第一行为矩阵的行数和列数,从第二行开始,为矩阵本身(假设输入的矩阵只有0和1个鞍点) 3 4 1 3 5 3 2 3 4 1 3 2 6 7
输出: Point: a[1][2] == 4 (下标从0开始)
#include
#include
int main()
{
int i[100][100], m, n, x, y, temp, log = 0;
scanf("%d%d",&m,&n);
for(y = 0; y < m; y++)
{
for(x = 0; x < n; x++)
{
scanf("%d",&i[y][x]);
}
}
//将每行的最大值放入每行的最后;
for(y = 0; y < m; y++)
{
temp = 0;
for(x = 0; x < n; x++)
{
if(i[y][x] > temp)
temp = i[y][x];
}
i[y][n] = temp;
}
//将每列的最小值放入每列的最后
for(x = 0; x < n; x++)
{
temp = 0x7fffffff;
for(y = 0; y < m; y++)
{
if(i[y][x] < temp)
temp = i[y][x];
}
i[m][x] = temp;
}
for(y = 0; y < m; y++)
{
for(x = 0; x < n; x++)
{
if((i[y][x] == i[m][x]) && (i[y][x] == i[y][n]))
{printf("Point:a[%d][%d]==%d\n",y,x,i[y][x]);log = 1;}
}
}
if(log == 0)
printf("No Point\n");
return 0;
}
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和 Ai: 表示第i位置上的身份证号码数字值 Wi: 表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11) Y = S % 11
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: X 广东省汕头市: 4
15位的身份证号升级办法:
15位的身份证号:dddddd yymmdd xx p
18位的身份证号:dddddd yyyymmdd xx p y
o 其中dddddd为地址码(省地县三级)
o yyyymmdd yymmdd 为出生年月日
o xx顺号类编码
o p性别
15 位的 yy 年升为 18 位后,变成 19yy年,但对于百岁以上老人, 则为 18yy 年,此时,他们的最后三位顺序码为996, 997, 998 或 999 来标记。
输入
输入n组身份证号码,第一行为个数,以后每行为身份证号码。
输出
如果输入的身份证号码为15位,则将其升级为18位后显示输出;否则判断其是否为合法身份证号,并逐行输出。
Code:
#include
#include
int main()
{
int n, i, m, j, sumt, y;
char s[100][19], temp[19], t;
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%s",s[i]);
for(i = 0; i < n; i++)
{
m = 0;
while(s[i][m] != '\0')
{
m++;
}
if( m != 15 && m != 18)
{
printf("Invalid\n");
}
if( m == 15)
{
for(j = 0; j < 6; j++)
temp[j] = s[i][j];
if(s[i][12] == '9' && s[i][13] == '9' && s[i][14] > '5')
{
temp[6] = '1'; temp[7] = '8';
}
else
{
temp[6] = '1'; temp[7] = '9';
}
for(j = 6; j < 16; j++)
temp[j + 2] = s[i][j];
strcpy(s[i],temp);
sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2;
//sumt = atoi(s[i][0]) * 7 + atoi(s[i][1]) * 9 + atoi(s[i][2]) * 10 + atoi(s[i][3]) * 5 +atoi(s[i][4]) * 8 + atoi(s[i][5]) * 4 + atoi(s[i][6]) * 2 + atoi(s[i][7]) * 1 + atoi(s[i][8]) * 6 + atoi(s[i][9]) * 3 + atoi(s[i][10]) * 7 + atoi(s[i][11]) * 9 + atoi(s[i][12]) * 10 + atoi(s[i][13]) * 5 + atoi(s[i][14]) * 8 + atoi(s[i][15]) * 4 + atoi(s[i][16]) * 2;
y = sumt % 11;
switch (y)
{
case 0: s[i][17] = '1'; break;
case 1: s[i][17] = '0'; break;
case 2: s[i][17] = 'X'; break;
case 3: s[i][17] = '9'; break;
case 4: s[i][17] = '8'; break;
case 5: s[i][17] = '7'; break;
case 6: s[i][17] = '6'; break;
case 7: s[i][17] = '5'; break;
case 8: s[i][17] = '4'; break;
case 9: s[i][17] = '3'; break;
case 10: s[i][17] = '2'; break;
}
s[i][18] = '\0';
printf("%s\n",s[i]);
}
if(m == 18)
{
sumt = (s[i][0] - '0') * 7 + (s[i][1]- '0') * 9 + (s[i][2] - '0') * 10 + (s[i][3] - '0') * 5 + (s[i][4] - '0') * 8 + (s[i][5] - '0') * 4 + (s[i][6]-'0') * 2 + (s[i][7]-'0') * 1 + (s[i][8]-'0') * 6 + (s[i][9]-'0') * 3 + (s[i][10]-'0') * 7 + (s[i][11]-'0') * 9 + (s[i][12]-'0') * 10 + (s[i][13]-'0') * 5 + (s[i][14]-'0') * 8 + (s[i][15]-'0') * 4 + (s[i][16]-'0') * 2;
y = sumt % 11;
switch (y)
{
case 0: t = '1'; break;
case 1: t = '0'; break;
case 2: t = 'X'; break;
case 3: t = '9'; break;
case 4: t = '8'; break;
case 5: t = '7'; break;
case 6: t = '6'; break;
case 7: t = '5'; break;
case 8: t = '4'; break;
case 9: t = '3'; break;
case 10: t = '2'; break;
}
if(t == s[i][17])
printf("Valid\n");
else
printf("Invalid\n");
}
}
return 0;
}
随着电子设备的广泛运用,密码也渐渐融入每个人的生活。保护好密码,不仅关系到个人隐私,更关系到个人的财产和安全。一个安全的密码,最好由大小写字母、数字或符号组成。包含越多种类的字符,其安全性就越高。同时密码还需要有一定的长度,通常至少要由六个以上的字符组成。
并不是每个人都喜欢这样复杂的密码,很多人在设置密码的时候,喜欢使用自己的名字或者生日,但这是很大的安全隐患。
任务
林晓炜正在设计一个网络交易系统,为了保证用户的密码安全,他需要一个程序,判断用户自己设置的密码是否安全,如果不安全,则给出提示。现在他向你求助,请你帮忙设计一个程序来解决这个问题。
应当按照以下的规则来判断密码是否安全:
1. 如果密码长度小于 6 位,则不安全
2. 如果组成密码的字符只有一类,则不安全
3. 如果组成密码的字符有两类,则为中度安全
4. 如果组成密码的字符有三类或以上,则为安全
通常,可以认为数字、大写字母、小写字母和其它符号为四类不同的字符。
输入
输入的第一行是一个整数 N,表明后面有多少组密码。随后的 N 行输入包括 N 个密码,每个密码的长度均小于 20 个字符。
输出
针对每一个密码判断并输出它是否安全。对于不安全的密码输出 "Not Safe",对于中度安全的密码输出 "Medium Safe",对于安全的密码输出 "Safe"
41234abcdefABC1231#c3Gh
输出样例
Not SafeNot SafeMediumSafe Safe
Code:
#include
#include
int main()
{
int n, i, j, m, log1, log2, log3, log4;
char s[100][21], t[10];
scanf("%d",&n);
gets(t);
for(i = 0; i < n; i++)
gets(s[i]);
for(i = 0; i < n; i++)
{
j = 0;
while(s[i][j] != '\0')
{
j++;
}
if(j < 6)
{
printf("Not Safe\n");
continue;
}
j = 0;
log1 = 0;
log2 = 0;
log3 = 0;
log4 = 0;
while(s[i][j] != '\0')
{
if(s[i][j] >= '0' && s[i][j] <= '9') log1 = 1;
if(s[i][j] >= 'a' && s[i][j] <= 'z') log2 = 1;
if(s[i][j] >= 'A' && s[i][j] <= 'Z') log3 = 1;
if(!(s[i][j] >= '0' && s[i][j] <= '9') && !(s[i][j] >= 'a' && s[i][j] <= 'z') && !(s[i][j] >= 'A' && s[i][j] <= 'Z')) log4 =1;
j++;
}
m = 0;
if(log1 == 1) m++;
if(log2 == 1) m++;
if(log3 == 1) m++;
if(log4 == 1) m++;
if(m == 1) printf("Not Safe\n");
if(m == 2) printf("Medium Safe\n");
if(m >= 3) printf("Safe\n");
}
return 0;
}
第七周作业
1.组成最大数
任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。
输入:自然数 n
输出:各位数字组成的最大数
Code:
#include
int main()
{
char s[50],t;
int n = 0, i, m;
scanf("%s",s);
while(s[n] != '\0')
{
n++;
}
for(i = 0; i < n - 1; i++)
{
for(m = i + 1; m < n; m++)
{
if(s[i] < s[m])
{
t = s[i];
s[i] = s[m];
s[m] = t;
}
}
}
printf("%s\n",s);
}
2.回文数
输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。
如: 1*1=1; 2*2=4;3*3=9;11*11=121
Code:
#include
int main()
{
int n, m, square, i, temp, log;
char s[6];
scanf("%d",&n);
for(m = 1; m < n; m++)
{
i = 0;
square = m * m;
log = 1;
while(square != 0)
{
temp = square % 10;
s[i] = '0' + temp;
i++;
square /= 10;
}
for(temp = 0; temp < i / 2; temp++)
{
if(s[temp] != s[i - 1 - temp]) log = 0;
}
if(log)
printf("%d\n",m);
}
return 0;
}
假设我们有 2n 张牌,它们以 1, 2, ..., n, n+1, ..., 2n 编号并在开始时保持着这种顺序。一次洗牌就是将牌原来的次序变为 n+1, 1, n+2, 2, ..., 2n, n,也就是将原来的前 n 张牌放到位置 2, 4, ..., 2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1, 3, ..., 2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。但我们不知道对于一个特定的 n,需要几次洗牌才能将牌洗回原来的次序。
输入: 牌张数的一半n,即初始情况下一共有2n张牌,n为int型整数
输出: 将牌洗回原来的次序所需要的洗牌次数
Code:
#include
int main()
{
int a[100000],tmp1[50000],tmp2[50000], i, m, n = 0, log = 0, total = 0;
scanf("%d",&i);
//
for(m = 0; m < 2* i; m++)
a[m] = m;
do{
for(m = 0; m < i; m++)
{
tmp1[m] = a[m];
tmp2[m] = a[m + i];
}
n = 0;
for(m = 0; m < i; m++)
{
a[n] = tmp2[m];
n++;
a[n] = tmp1[m];
n++;
}
log = 0;
for(m = 0; m < 2 * i; m++)
{
if(a[m] != m)
{
log = 0;
break;
}
if(a[m] == m)
{
log = 1;
}
}
total++;
}while(log != 1);
printf("%d\n",total);
return 0;
}
4子数整除(10分)
题目内容:
对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:
sub1=a1a2a3
sub2=a2a3a4
sub3=a3a4a5
例如,五位数20207可以拆分成:
sub1=202
sub2=020(=20)
sub3=207
现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1、sub2、sub3都可被K整除。
输出时请按照由小到大的顺序排列(每行输出一个数)。
输入格式:
一个正整数K
输出格式:
请按照由小到大的顺序排列(每行输出一个数)
输入样例:
15
输出样例:
22555[回车]
25555[回车]
28555[回车]
30000[回车]
时间限制:500ms内存限制:32000kb
Code:
#include
main()
{
int k, a,num1,num2,num3;
scanf("%d",&k);
for (a=10000;a!=30001;a++)
{
num1=a/100;
num2=a/10-(a/10000)*1000;
num3=a-(a/1000)*1000;
if((num1 % k)==0&&(num2 % k)==0&&(num3 % k)==0)
printf("%d\n",a);
}
return 0;
}
¥29.8
¥9.9
¥59.8