该代码中,我们首先从用户输入中读取一个正整数 n,然后使用一个 for 循环遍历 1 到 n 中的所有数。对于每个数,我们计算它的各位数字之和,并检查该数字之和是否等于 9。如果等于 9,则将该数加入总和 sum 中,并将符合条件的数的数量加 1。
创新互联是一家专业从事成都网站建设、成都做网站、网页设计的品牌网络公司。如今是成都地区具影响力的网站设计公司,作为专业的成都网站建设公司,创新互联依托强大的技术实力、以及多年的网站运营经验,为您提供专业的成都网站建设、营销型网站建设及网站设计开发服务!
最后,我们检查是否存在各位数字之和为 9 的数,如果存在,则输出它们的平均值。如果不存在,则输出提示信息。
以下是一个可以解决这个问题的 C 代码:
#include
int main() {
int n;
int sum = 0;
int count = 0;
printf("请输入一个正整数n:");
scanf("%d", n);
for (int i = 1; i = n; i++) {
int num = i;
int digit_sum = 0;
while (num != 0) {
digit_sum += num % 10;
num /= 10;
}
if (digit_sum == 9) {
sum += i;
count++;
}
}
if (count == 0) {
printf("1-%d中没有各位数字之和为9的数\n", n);
} else {
printf("1-%d中各位数字之和为9的数的平均值为%.2f\n", n, (float)sum / count);
}
return 0;
}
prime的作用就是判断一个数是否为素数(也称“质数”)。
例如:
#include stdio.h
int IsPrime(int n)
{
if (n = 1) return 0;
if (n % 2 == 0) return n == 2;
for (int i = 3; ; i += 2)
{
if (i n/i) break; // 等价于 i*i n, 不用开方
if (n % i == 0) return 0;
}
return 1;
}
int main()
{
for (int n = 100; n = 300; n++)
if (IsPrime(n))
printf("%4d", n);
return 0;
}
扩展资料:
prime算法
prime是以点为基础出发进行检索最小生成树的一种贪心算法。
思想:
将所有的点分成两类,一类是已经放到碗里的,另一类是还没有有放到碗里的,可以通过一个数组bool visit[]来记录这个点到底是属于第一类还是属于第二类之后每一个周期索要进行的操作,找出一一定范围内路径的的范围的最小值。
所有的从第一类点直接连接到第二类点的边将最小的边记录下来(这个也就是生成树中的一条边)将这个新边(这个一个连接第一类点和第二类点的边)连到的那个第二类点归类到第一类点中,之后重复这个操作,最终消灭所有的第二类点。
假设有n个节点,我最初给出一个点,以这个点开始进行搜索,这个时候该点为第一类点,其余n-1个点为第二类点。之后进行n-1次操作,一共选出了n-1个边(符合树的性质),构成了最小生成树。
/*
* 此程序可以ls 多个文件
* 范例: ./myls file1 file2 dt1 dt2 后面参数可以多个,
*
*/
#include pwd.h
#include grp.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include unistd.h
#include stdlib.h
#include string.h
#include dirent.h
#include limits.h
#include time.h
#include stdio.h
/*
* 读取不是目录的文件
* argv : 文件名
* 返回值: 出错1, 正确0
*/
int lsregfile(char *argv) //读取不是目录的文件
{
struct stat buf;
if (lstat(argv, buf) 0) //读取文件信息。
{
printf("%s:stat error\n",argv);
return 1;
}
char str[10] = "";
/******************判断文件的类型***********************/
if (S_ISREG(buf.st_mode)) str[0] = '-';
else if (S_ISDIR(buf.st_mode)) str[0] = 'd';
else if (S_ISCHR(buf.st_mode)) str[0] = 'c';
else if (S_ISBLK(buf.st_mode)) str[0] = 'b';
else if (S_ISFIFO(buf.st_mode)) str[0] = 'p';
#ifdef S_ISLNK
else if (S_ISLNK(buf.st_mode)) str[0] = 'l';
#endif
#ifdef S_ISSOCK
else if (S_ISSOCK(buf.st_mode)) str[0] = 's';
#endif
else str[0] = 'U'; //表示未知文件类型
/************************* 输出权限 ************************/
str[1] = ((buf.st_mode S_IRUSR) != 0) ? 'r' : '-';
str[2] = ((buf.st_mode S_IWUSR) != 0) ? 'w' : '-';
str[3] = ((buf.st_mode S_IXUSR) != 0) ? 'x' : '-';
//判断设置-用户-ID
str[3] = ((buf.st_mode S_ISUID) != 0) ? 's' : str[3];
str[4] = ((buf.st_mode S_IRGRP) != 0) ? 'r' : '-';
str[5] = ((buf.st_mode S_IWGRP) != 0) ? 'w' : '-';
str[6] = ((buf.st_mode S_IXGRP) != 0) ? 'x' : '-';
//判断设置-用户组-ID
str[6] = ((buf.st_mode S_ISGID) != 0) ? 'x' : str[6];
str[7] = ((buf.st_mode S_IROTH) != 0) ? 'r' : '-';
str[8] = ((buf.st_mode S_IWOTH) != 0) ? 'w' : '-';
str[9] = ((buf.st_mode S_IXOTH) != 0) ? 'x' : '-';
printf("%s ", str);
// 输出硬链接数
printf("%3ld ", (long) buf.st_nlink);
// 输出文件所有者。
struct passwd *ppd;
ppd = getpwuid(buf.st_uid);
printf("%-5s ", ppd-pw_name);
// 输出文件所有者的组名
struct group *pgroup;
pgroup = getgrgid(buf.st_gid);
printf("%-5s ", pgroup-gr_name);
// 输出文件大小
printf("%5lld ", (long long) buf.st_size);
// 输出最近修改时间
struct tm *ptime = NULL;
ptime = gmtime(buf.st_mtime);
printf("%.4d-%.2d-%.2d %.2d:%.2d ",
(1900 + ptime-tm_year),
(1 + ptime-tm_mon),
ptime-tm_mday,
ptime-tm_hour,
ptime-tm_min);
// 输出文件名
printf("%s", argv);
if (str[0] == 'l') //如果是链接文件,获取链接对象名
{
printf(" - ");
char linkbuf[100] = "";
if (readlink(argv, linkbuf, sizeof(buf)) 0 )
{
printf("%s: readlink error\n",argv);
return 1;
}
printf("%s", linkbuf);
}
printf("\n");
return 0;
}
/*
* 读取目录里面不带.和..的所有文件的信息.
* argv : 文件名
* 返回值: 出错1, 正确0
*/
int lsdir(char *argv) //读取目录
{
printf("%s:\n", argv);
DIR *pread;
pread = opendir(argv);// 打开目录
if (pread == NULL)
{
printf("%s: opendir error\n",argv);
return 1;
}
if (chdir(argv) 0) //修改工作目录 使下面的stat能成功.
{
printf("%s chdir error\n", argv);
return 1;
}
struct dirent *pd = NULL;
long long ssize = 0;
while ((pd = readdir(pread)) != NULL)
{
if ((!strcmp(pd-d_name, ".")) || (!strcmp(pd-d_name, "..")))
continue; //当文件为.或..时跳过。
struct stat buf;
if (lstat(pd-d_name, buf) 0) //读取文件信息。
{
printf("%s: stat error\n", argv);
return 1;
}
char str[10] = "";
/******************判断文件的类型***********************/
if (S_ISREG(buf.st_mode)) str[0] = '-';
else if (S_ISDIR(buf.st_mode)) str[0] = 'd';
else if (S_ISCHR(buf.st_mode)) str[0] = 'c';
else if (S_ISBLK(buf.st_mode)) str[0] = 'b';
else if (S_ISFIFO(buf.st_mode)) str[0] = 'p';
#ifdef S_ISLNK
else if (S_ISLNK(buf.st_mode)) str[0] = 'l';
#endif
#ifdef S_ISSOCK
else if (S_ISSOCK(buf.st_mode)) str[0] = 's';
#endif
else str[0] = 'U'; //表示未知文件类型
/************************* 输出权限 ************************/
str[1] = ((buf.st_mode S_IRUSR) != 0) ? 'r' : '-';
str[2] = ((buf.st_mode S_IWUSR) != 0) ? 'w' : '-';
str[3] = ((buf.st_mode S_IXUSR) != 0) ? 'x' : '-';
//判断设置-用户-ID
str[3] = ((buf.st_mode S_ISUID) != 0) ? 's' : str[3];
str[4] = ((buf.st_mode S_IRGRP) != 0) ? 'r' : '-';
str[5] = ((buf.st_mode S_IWGRP) != 0) ? 'w' : '-';
str[6] = ((buf.st_mode S_IXGRP) != 0) ? 'x' : '-';
//判断设置-用户组-ID
str[6] = ((buf.st_mode S_ISGID) != 0) ? 'x' : str[6];
str[7] = ((buf.st_mode S_IROTH) != 0) ? 'r' : '-';
str[8] = ((buf.st_mode S_IWOTH) != 0) ? 'w' : '-';
str[9] = ((buf.st_mode S_IXOTH) != 0) ? 'x' : '-';
printf("%s ", str);
// 输出硬链接数
printf("%3ld ", (long) buf.st_nlink);
// 输出文件所有者。
struct passwd *ppd;
ppd = getpwuid(buf.st_uid);
printf("%-5s ", ppd-pw_name);
// 输出文件所有者的组名
struct group *pgroup;
pgroup = getgrgid(buf.st_gid);
printf("%-5s ", pgroup-gr_name);
// 输出文件大小
printf("%5lld ", (long long) buf.st_size);
ssize += buf.st_size;
// 输出最近修改时间
struct tm *ptime = NULL;
ptime = gmtime(buf.st_ctime);
printf("%.4d-%.2d-%.2d %.2d:%.2d ",
(1900 + ptime-tm_year),
(1 + ptime-tm_mon),
ptime-tm_mday,
ptime-tm_hour,
ptime-tm_min);
// 输出文件名
printf("%s", pd-d_name);
if (str[0] == 'l') //如果是链接文件,获取链接对象名
{
printf(" - ");
char linkbuf[100] = "";
if (readlink(pd-d_name, linkbuf, sizeof(buf)) 0 )
{
printf("%s: readlink error\n", argv);
return 1;
}
printf("%s", linkbuf);
}
printf("\n");
}
// 输出总用量
printf("总用量 %lld\n", ssize/1024);
///////////////////////////////////////////////////////
if (closedir(pread) 0) //关闭目录
{
printf("%s: closedir error\n", argv);
return 1;
}
}
/*
*
* 这个程序,把非目录文件和目录分开读。
*
*/
int main(int argc, char *argv[])
{
if (argc == 1)
{
printf("the argument is wrong\n");
exit(1);
}
int i;
for (i = 1; i argc; ++i)
{
// 保存当前的工作目录。以便返回当前工作目录
char bufpwd[80];
char *getp =NULL;
getp = getcwd(bufpwd, sizeof(bufpwd));
if (getp == NULL)
{
printf("%s : getcwd error\n",argv[i]);
return 1;
}
struct stat buf0; //获取文件信息
if (stat(argv[i], buf0) 0)
{
printf("%s: stat error\n", argv[i]);
continue; //出错跳过
}
if (!S_ISDIR(buf0.st_mode)) //如果读取的不是目录。就直接去读文件。
lsregfile(argv[i]); //读文件
else
lsdir(argv[i]); //读目录
// 改变工作目录回原来的工作目录,以便读取相对路径的文件
if (chdir(bufpwd) 0)
{
printf("%s : chdir error\n", argv[i]);
return 1;
}
}
return 0;
}
首先是最简单的读写一个字符的函数fputc和fgetc,在这个基础上又出现了putw和getw、fgets和fputs,此外还说过格式化读写函数fprintf和fscanf函数。
从原理上来说,只要fputc和fgetc函数基本就可以完成数据的读写操作了,但是在实际的使用中会遇到诸多不便,因此上面那一大堆函数就冒出来了(其实也不多)。上面函数中最方便的就是格式化读写函数fprintf和fscanf了,因为可以一行行的进行读取,但是有个问题就是这两位老人家动作比较慢,fprintf在写文件的时候要把二进制形式表示的数据转换为ASCII码形式,fscanf在读文件的时候又要将ASCII码转换为二进制的形式。
好不容易出来个好用的函数,竟然是个慢性子,聪明的你现在也许就在想了:那能不能不转换,直接读写二进制的数据呢?答案就是fread和fwrite,在需要频繁进行数据读写的时候,使用这两个函数将大大提升效率。
fread和fwrite函数的定义
fread(pBuffer,size,count,pFile);
fwrite(pBuffer,size,count,pFile);
要读写一个数据块的话,无论是读还是写,都需要指定一个起始地址,读的话从这个起始地址读,写的话从这个起始地址写,上面函数定义中的第一个参数pBuffer就是用于指定这个起始地址,size读写的字节数,count则指定读写多少个size大小的数据,pFile是文件结构指针。
fread和fwrite函数使用示例
说到数据块我们自然会想到结构体,如果一个文件中保存的是一个个结构体信息,那每一个结构体信息就可以看做一个数据块了。这里直接用前面文章中我们一直使用的学生成绩信息的结构体:
C语言: 知蚁博客
struct student
{
int nID; //学号
char chName[20]; //姓名
float fScores[3]; //3门课的成绩
};
实例程序有点小复杂的,首先我们自己新建一个txt文件,也就是ASCII文件啦,然后写上一些数据,如下:
1 zhangsan 78.0 79.0 80.0
2 lisi 79.0 77.0 78.0
3 wangwu 90.0 97.0 78.0
4 zhaokai 56.0 57.0 58.0
我们先用ASCII方式打开这个文件,通过fscanf函数读取里面的数据,然后通过fwrite写入到新的二进制格式的文件中,这样我们就得到了一个保存上面信息的二进制格式的文件了,下面就是通过fread函数进行数据的读取了。(记住:fread和fwrite一般用于二进制文件的输入输出,ASCII文件还是不要考虑了)。
C++语言: 知蚁博客
#include "stdio.h"
struct student
{
int nID; //学号
char chName[20]; //姓名
float fScores[3]; //3门课的成绩
};
void main()
{
FILE *pRead,*pWrite;
struct student tStu[4];
struct student *ptStu = NULL;
int nCount = 0;
//ASCII方式打开文件 用于读入
pRead=fopen("stu_scores.txt","r");
if(NULL == pRead)
{
return;
}
//二进制文件打开文件 用于写入
pWrite=fopen("stu_scores_bin.txt","wb");
if(NULL == pWrite)
{
fclose(pRead);
return;
}
//fscanf读取数据,fwrite写入数据
ptStu = tStu;
while(!feof(pRead))
{
fscanf(pRead,"%d %s %f %f %f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
fwrite(ptStu,sizeof(struct student),1,pWrite);
printf("%d %s %.1f %.1f %.1f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
ptStu++;
}
fclose(pRead);
fclose(pWrite);
memset(tStu,0×00,sizeof(tStu)); //清空数据
//二进制文件打开文件 用于读取
pRead=fopen("stu_scores_bin.txt","rb");
if(NULL == pRead)
{
printf("open file stu_scores_bin.txt failed");
return;
}
//下面有两种fread的读数据方式,将下面的1换成0,则使用第二种方式
#if 1
//一条条的读取
ptStu = tStu;
nCount = fread(ptStu,sizeof(struct student),1,pRead);
while(nCount0)
{
printf("%d %s %.1f %.1f %.1f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
ptStu++;
nCount = fread(ptStu,sizeof(struct student),1,pRead);
}
#else
//因为事先知道有4条信息,因此可以直接读取四条信息
fread(tStu,sizeof(struct student),4,pRead);
for(nCount=0; nCount4; nCount++)
{
printf("%d %s %.1f %.1f %.1f\n",tStu[nCount].nID,tStu[nCount].chName,tStu[nCount].fScores[0],tStu[nCount].fScores[1],tStu[nCount].fScores[2]);
}
#endif
fclose(pRead);
}
上面用fread读取的时候,我们既可以一条条的读取,也可以一次读入多条,这就是为什么参数中有size和count的原因