c语言程序设计 代码及思路

求分享代码和解题思路,每个题目都有时间限制,做法尽量简单易懂,还有想问一下这种程序设计课听什么课做什么题会有提高?

img

img

img

img

img

img

那第二题来说事
就是一个通过计算机语言求分数的问题,给定一个算式,各项分子为1,分母是前一项分母的2倍,常规做法就是通分然后分子相加;通分后,分母是最后一项的分母,分子从右往左,从1开始,依次2倍关系。通分求和后,题目要求分子分母互质,那么要找到分子分母的最大公约数。那么初步源码如下

#include <stdio.h>

// 求最大公约数
int gcd(int a, int b)
{
    if (a == b)
    {
        return a;
    }
    else if (a > b)
    {
        return gcd(a - b, b);
    }
    else
    {
        return gcd(b - a, a);
    }
}

int main()
{
    setvbuf(stdout, NULL, _IONBF, 0);

    while(1)
    {
        int n = 0;
        scanf("%d", &n);
        
        // 分子
        int numerator = 1;
        // 分母
        int denominator = 1;
        // 通分后的分子项
        int tmp = 1;
        for (int i=0; i < n - 1; ++i)
        {
            tmp *= 2;
            numerator += tmp;
        }
        denominator = tmp;

        int gcd_num = gcd(numerator, denominator);
        numerator /= gcd_num;
        denominator /= gcd_num;

        printf("%d/%d\n", numerator, denominator);
    }
    
    return 0;
}

运行后,你会发现,无论n为何值,最终的结果总是分子是分母的2倍减一关系,这种关系绝对是互质的,那么程序简化如下

#include <stdio.h>

int main()
{
    setvbuf(stdout, NULL, _IONBF, 0);

    while(1)
    {
        int n = 0;
        scanf("%d", &n);
        
        // 分子
        int numerator = 1;
        // 分母
        int denominator = 1;

        for (int i=0; i < n - 1; ++i)
        {
            denominator *= 2;
        }

        numerator = denominator * 2 - 1;

        printf("%d/%d\n", numerator, denominator);
    }
    
    return 0;
}

最后说一下开发环境

去mooc听听浙大翁凯的c吧 也是我的研究生导师,真的太基础了不想写。c语言你要多打可以找个在线编译网站,这种博客也很多,最好要那种闯关的,可以让你学习到每个函数,只要学会指针就好啦,这些代码你可以用gpt做的
添加gpt的方法:使用我们开发的bing浏览器,点击拓展,搜索chatgpt,这里有很多公司自己建立的,有的免费有的要钱看你自己,简单的代码免费的就能完成

#include <stdio.h>

int isPrime(int num) {
    if (num <= 1) {
        return 0;
    }
    
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return 0;
        }
    }
    
    return 1;
}

int main() {
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++) {
        int num;
        scanf("%d", &num);
        
        if (isPrime(num)) {
            printf("%d\n", num);
        }
    }
    
    return 0;
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
题目:输入一个整数,将其分解为质数的乘积。

思路:先从2开始检查被分解数是否能够整除,如果能则输出2,并将该数除以2,接着对3、5、7……也同样进行类似操作,直至这个数被分解完成。

代码示例:

#include<stdio.h>
#include<math.h>

int main(){
    int n, i;
    scanf("%d", &n);
    printf("%d=", n);
    for(i = 2; i <= sqrt(n); i++){
        while(n % i == 0){
            printf("%d", i);
            n = n / i;
            if(n != 1){
                printf("*");
            }
        }
    }
    if(n != 1){
        printf("%d", n);
    }
    return 0;
}

题目:统计一篇英文文章中单词的个数。

思路:将文章中每个单词都看作一个字符串,统计字符串的个数即可。

代码示例:

#include<stdio.h>
#include<string.h>

#define MAXN 1000

int main(){
    char s[MAXN], word[MAXN];
    int cnt = 0, i, j;
    gets(s);  // 输入英文文章
    int len = strlen(s);
    for(i = 0; i < len; i++){
        if(s[i] != ' '){  // 如果不是空格,则是单词的一部分,将它加入word字符串中
            word[cnt] = s[i];
            cnt++;
        }else{  // 如果是空格,则单词结束,cnt清零记录下一个单词
            if(cnt > 0){
                word[cnt] = '\0';
                cnt = 0;
                printf("单词:%s\n", word);
            }
        }
    }
    if(cnt > 0){  // 输出最后一个单词
        word[cnt] = '\0';
        printf("单词:%s\n", word);
    }
    return 0;
}

对于如何提高程序设计能力这个问题,我的建议是要多做题并且多实践。可以在网上找一些编程练习平台,例如LeetCode、牛客网等,做些算法题可以提高自己的编程水平和解题能力。此外,还可以学习一些数据结构、算法的知识,加深对编程的理解,提高自己的设计能力。最重要的是,多思考,多思考,多思考,这是成为一名好程序员的关键。
如果我的回答解决了您的问题,请采纳!

你好,会简单的,A的答案和思路:

#include<stdio.h>

// 判断一个整数是否是素数
// 如果是素数,返回1,否则返回0
int is_prime(int n) {
  // 如果n小于等于1,直接返回0
  if (n <= 1) {
    return 0;
  }
  // 如果n等于2或3,直接返回1
  if (n == 2 || n == 3) {
    return 1;
  }
  // 如果n能被2或3整除,直接返回0
  if (n % 2 == 0 || n % 3 == 0) {
    return 0;
  }
  // 从5开始,每次增加2或4,检查是否能被n整除
  // 只需要检查到sqrt(n)即可
  int i = 5;
  int w = 2;
  while (i * i <= n) {
    if (n % i == 0) {
      return 0;
    }
    i += w;
    w = 6 - w;
  }
  // 如果没有找到能整除n的数,返回1
  return 1;
}

int main() {
    int n;
    scanf("%d", &n);
    
    for (int i = 0; i < n; i++) {
        int num;
        scanf("%d", &num);
        
        if (isPrime(num)) {
            printf("%d\n", num);
        }
    }
    
    return 0;
}