c语言数组如何把一串数字存入数组_C语言经典编程题(下)

这篇博客介绍了C语言的经典编程题目,包括字符串加密解密算法,输出等腰三角形,约瑟夫环问题,整数逆序输出,以及涉及数论的如求素数、完数、亲密数和自守数的方法。通过实例和算法思想探讨了C语言在解决这些问题时的实现策略。
摘要由CSDN通过智能技术生成
C语言字符串加密和解密算法C语言输出等腰三角形C语言约瑟夫环问题C语言整数逆序输出C语言三色旗问题C语言求定积分C语言求空间两点之间的距离C语言日期处理函数C语言汉诺塔问题C语言九九乘法表C语言杨辉三角C语言求圆周率πC语言判断素数(求素数)C语言输出菱形C语言百钱买百鸡问题C语言求完数(完全数)C语言求亲密数C语言求自守数

C语言字符串加密和解密算法

在本实例中要求设计一个加密和解密算法。在对一个指定的字符串加密之后,利用解密函数能够对密文解密,显示明文信息。加密的方式是将字符串中每个字符加上它在字符串中的位置和一个偏移值 5。以字符串“mrsoft”为例,第一个字符“m”在字符串中的位置为 0,那么它对应的密文是“'m'+0+5",即 r。

算法思想

在 main() 函数中使用 while 语句设计一个无限循环,并定义两个字符数组,用来保存,明文和密文字符串,在首次循环中要求用户输入字符串,进行将明文加密成密文的操作, 之后的操作则是根据用户输入的命令字符进行判断,输入 1 加密新的明文,输入 2 对刚加密的密文进行解密,输入 3 退出系统。

#include #include int main(){
        int result=1;    int i;    int count=0;    char Text[128]={
    '\0'};    char cryptograph[128]={
    '\0'};    while(1)    {
            if(result==1)        {
                printf("请输入要加密的明文:\n");            scanf ("%s",&Text);            count=strlen(Text);            for(i=0;i            {
                    cryptograph[i]=Text[i]+i+5;            }            cryptograph[i]='\0';            printf("加密后的密文是:%s\n",cryptograph);        }        else if(result==2)        {
                count=strlen(Text);            for(i=0;i            {
                    Text[i]=cryptograph[i]-i-5;            }            Text[i]='\0';            printf("解密后的明文是:%s\n",Text);        }        else if(result==3)        {
                break;        }        else        {
                printf("请输入正确的命令符:\n");        }        printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");        printf("请输入命令符:\n");        scanf("%d",&result);    }    return 0;}调试运行结果本实例中,输入了 I love Xichang College 字符串作为例证,因此输出是多个加密后的字符串,结果如下所示:请输入要加密的明文:I Love Xichang College加密后的密文是:N输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:请输入命令符:请输入要加密的明文:加密后的密文是:Qu}m输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:请输入命令符:请输入要加密的明文:加密后的密文是:]ojpjxr输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:请输入命令符:请输入要加密的明文:加密后的密文是:Hustnqp输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:请输入命令符:

C语言输出等腰三角形

本实例要求从键盘输入任意整数 n,通过程序运行输出对应高度为 n 的等腰三角形。

算法思想

① 设计以高度 n 为参数的一个函数,函数返回值为空,在函数体中实现等腰三角形的打印;图形的最终打印需要利用二层循环设计实现。② 图形共输出 n 行,外循环变量 i 表示 n 行的输出,循环变量的变化范围为 0~(n—1)。③ 循环变量 j 表示每一行的“*”号输出。由于每一行的输出不同,第 j 行输出空格的个数为 (n—i),第 j 行输出“*”号的个数为(2*i+1)。控制“*”号输出的内循环变量 j 的变化范围为 0~(2*i)。④ 在主函数中输入 n 作为实参,调用定义函数,打印等腰三角形。

#include int trangle(int n){
        int i,j;    for(i=0;i    {
            for(j=0;j<=n-i;j++)            putchar(' ');        for(j=0;j<=2*i;j++)            putchar('*');        putchar('\n');    }    return 0;}int main(){
        int n;    printf("Enter n:");    scanf("%d",&n);    printf("\n");    trangle(n);    return 0;}调试运行结果当 n 取值为 8 时,打印出的等腰三角形如下所示:Enter n:8         *        ***       *****      *******     *********    ***********   *************  ***************

C语言约瑟夫环问题

编号为 1,2,3,…,n 的 n 个人围坐一圈,任选一个正整数 m 作为报数上限值,从第一个人开始按顺时针方向报数,报数到 m 时停止,报数为 m 的人出列。从出列人的顺时针方向的下一个人开始又从 1 重新报数,如此下去,直到所有人都全部出列为止。

算法思想

每个人的编号存放在一个数组 a 中,主函数中决定人数的个数以及报数的上限值 m,设计一个函数实现对应的操作。函数的形参有整型数组 a、整数 n 和 m,n 用来接收传递的人数,m 用来接收报数上限,函数的返回值为空;函数体中输出出列人的顺序。函数中利用循环访问数组中 n 个元素,每次访问元素,设定内循环连续访问 m 个元素,元素访问的下标为 k,访问到第 m 个元素时,如果元素不是 0,此时输出元素 a[k],再设定 a[k] 为 0,继续访问后面的元素。主函数中设定数组 a,从键盘输入 n 和 m,利用循环产生 n 的位置序号存放到数组 a 中,调用函数实现相应的操作。

#include #define N 100int josef(int a[],int n,int m){
        int i,j,k=0;    for(i=0;i    {
            j=1;        while(j        {
                while(a[k]==0)            k=(k+1)%n;            j++;            k=(k+1)%n;        }        while(a[k]==0)        k=(k+1)%n;        printf("%d ",a[k]);        a[k]=0;    }    return 0;}int main(){
        int a[100];    int i,j,m,n;    printf("input n and m:");    scanf("%d%d",&n,&m);    for(i=0;i        a[i]=i+1;    printf("\n output:\n");    josef(a,n,m);    printf("\n");    return 0;}调试运行结果15 个人围坐在一起,报数上限为 4 时的出列顺序如下所示:input n and m:15 4output:4 8 12 1 6 11 2 9 15 10 5 3 7 14 13

C语言整数逆序输出

将一个从键盘输入的整数存放到一个数组中,通过程序的运行按照数组中的逆序输出该整数,利用递归的方法解决问题。

算法思想

设计函数实现数据的逆序存放,设定形参数组接收实参数组的地址,来存储数据的每一位。函数体采用递归的方式解决问题,因此考虑递归进行的条件。例如,把数据 n 存放到数组 s 中,若 n 是一位数,则存放 n 到数组中;若 n 不是一位数,则存放 n/10 到数组中。问题解决的难点在于找到数据的存放地址,通过不断地取余和整除 10 来得到数据的每一位。为了实现数据的逆序存放,每一次整除 10 的时候,同时把存放数据的数组地址后移,这样得到的第一位数存放在数组的最后一位……通过依次前移,即递归的回归,实现整个数据的存放。通过函数 convert() 实现字符串中的数字的逆序转换。
#include int convert(char s[],int n){
        int i;    if((i=n/10)!=0)         convert(s+1,i);    *s=n%10+'0';    return 0;}int main(){
        int num;    char str[10]=" ";    printf("input integer data:");    scanf("%d",&num);    convert(str,num);    printf("output string:\n");    puts(str);    return 0;}

C语言三色旗问题

有一根绳子,上面有红、白、蓝三种颜色的旗子。绳子上旗子的颜色并没有顺序,现在要对旗子进行分类,按照蓝色、白色、红色的顺序排列。只能在绳子上进行移动,并且一次只能调换两面旗子,怎样移动才能使旗子移动的次数最少?

算法思想 旗子在绳子上移动,而且一次只能调换两面旗子,因此只要保证在移动旗子时,从绳子的开头开始,遇到蓝色旗子向前移动,遇到白色旗子则留在中间,而遇到红色的旗子则向后移动。要使移动次数最少,可以使用三个指针 b、w、r 分别作为蓝旗、白旗和红旗的指针。
若 w 指针指向的当前旗子为白色,则 w 指针增加 1,表示白旗部分增加一面。若 w 指针指向的当前旗子为蓝色,则将 b 指针与 w 指针所指向的旗子交换,同时 b 指针与 w 指针都增加 1,表示蓝旗和白旗部分都多了一个元素。若 w 指针指向的当前旗子为红色,则将 w 指针与 r 指针所指向的旗子交换,同时 r 指针减 1,即 r 指针向前移动,未处理的部分减 1。刚开始时,r 指向绳子中最后一个旗子,之后 r 指针不断前移,当其位于 w 指针之前,即 r 的值小于 w 的值时,全部旗子处理完毕,可以结束比较和移动旗子操作。
在程序中通过宏定义用大写字母 'B' 'W' 'R' 分别代表蓝色、白色和红色;字符数组 “char color[]”表示绳子上的各种颜色的旗子;旗子移动时通过一个 while 循环判断移动过程是否结束,在 while 循环中根据旗子的不同颜色进行不同的处理。
#include #include #include #define BLUE 'B'#define WHITE 'W'#define RED 'R'#define swap(x,y){char temp;\        temp=color[x];\        color[x]=color[y];\        color[y]=temp;}int main(){
        char color[]={
    'R','W','B','W','W','B','R','B','W','R','\0'};    int w=0;    int b=0;    int r=strlen(color)-1;    int i;    for(i=0;i<strlen(color);i++)        printf("%c ",color[i]);    printf("\n");    while(w<=r)    {
            if(color[w]==WHITE)            w++;        else        {
                if(color[w]==BLUE)            {
                    swap(b,w);                b++;                w++;            }            else            {
                    while(w                    r--;                swap(r,w);                    r--;            }        }    }    for(i=0;i<strlen(color);i++)        printf(&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值