c语言pn
① 在c语言中,如何输出一组数的排列组合
#include <stdio.h>
#include <stdlib.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf(" ");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//输入自然数的个数
printf("请输入连续自然数的个数:");
scanf("%d",&k);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);
return 0;
}
该程序的输入为一个任意自然数n,将输出从1到n的全排列。
(1)c语言pn扩展阅读:
C语言的基本数的排列法
1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf(" ");
}
return 0;
}
2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}
② 在c语言中int **p,如果想取它的值,用*p来表达吗
不是。
语句int **p;定义的p是二级指针,也就是,“指向指针的指针”,所以,用*p取出来的,仍然是一个地址。要想取出存放的用户数据,必须要用**p,才可以。
另外,你题目中的叙述有点问题,就是那个“它”指的是谁,是p吗?
现在分析一下:
当你用int **p;声明一个变量时,系统会给变量p分配一个储存空间,分配完后,可以用&p查看这个变量的位置。但是,它是一个空指针,不管用*p还是**p都只会得到乱码,没有实际作用。
但是你可以使用它,比如你有定义两个变量:
int a=5,*b;
并且再给b和p赋值:
b=&a;
p=&b;
那么,你就可以用:
p得到p的值(里面存的b的地址)
*p得到b的值(里面存的a的地址)
**p得到a的值(5)
所以,你确定是要p的值吗?直接用p就可以。要想a的值,就要用**p了。
不知说明白没有,如果有什么问题请留言。
③ C语言结构体问题
朋友 你碰上的是经典错误
首先第一个错 pn->b/n.a*++pn->b 翻译之后变成 b/a*(++b) = 3/1*4 = 12
第二个错 即使按照你所描述的想法 估计按照你写的程序 你会这样改 :
pn->b/n.a*(++pn)->b
你肯定认为 (++pn)->b 是指向 c (也就是5.0)的吧 你试着运行 同样错 结果为0
根本原因:知识点理解---指针类型(此处为结构体指针)
struct x *pn 代表了pn是一个指向 struct x 类型的指针,所以,当 执行 (++pn)时,pn指针指向的地址增加的数量 等于 struct x 的字节数 也就是 int + int + float 的字节数 所以指向一个未知的空间 (此处的值默认为0)------------------所以并非楼主认为的变成指向 c
知识点类比:int *p = &n,当执行(++p) ,p指向的地址增加 int 的字节数
float *p = &n 当执行(++p) ,p指向的地址增加 float 的字节数
余下同理......
④ 用C语言求多项式Pn(x)=anx^n+...+a1x+a0
#defineN5
doublePn(double*an,intn,doublex)
{
doublepn=0;
for(inti=0;i<n;++i)
{
pn*=x;
pn+=an[i];
}
returnpn;
}
intmain()
{
//Pn=1*X^4+2*X^3+3*X^2+4*X+5
doublean[N]={1,2,3,4,5};
//Pn(2)=2^4+2*2^3+3*2^2+4*2+5=57
doublepn=Pn(an,N,2);
printf("pn=%lf ",pn);
return0;
}
⑤ C语言问题,球高手解答
请问:
//用间接存取方式修改六个变量的值:char型大写变小写,int型减5,double型加10.0
*pch_1 += 32; *pch_2 += 32;
*pn_1 -= 5; *pn_2 -= 5;
*pd_1 += 10.0; *pd_2 += 10.0;这里
为什么不可以用 *pch_1=*pch_1+32;
——可以,两者是等效的
或者 *pch_1=‘*pch_1’+32;
——不可以,语法错误了,单引号只能表示某个字符,比如'A‘
或者 *pch_1=”*pch_1“+32;
——不可以,双引号表示字符串
还有为什么
//定义两个指针变量pd_1、pd_2分别指向d1、d2
double *pd_1=&d1;double *pd_2=&d2;
把double 改成float就输不出来数据呢?
——double和float的字节长度不一样,虽然在内存里的数据是一样的,但机器存取内存和解释的时候不一样,所以输出的数据不一致的话会乱掉。
⑥ 高手看看我这C语言程序为什么不能运行,编译没问题啊 请编写算法,求一元多项式Pn(x) = 的值Pn(x0)。 本题
具体怎么计算我就没去看了··你的那个float f()这个函数的声明不应该放到main函数里,应该放到主函数的外面,在主函数里应该是直接调用,还有
float f(float x,int i)
{
float f=1.0;
while(i>0)
{ f*=x; i--;}
return f;
}
你这个函数名字是f,变量名也是f应该也有问题,太不规范了,函数名字最好能直接看出他的功能
比如函数strcat一看就知道是连接字符串的,只是建议哈··对你以后从事这行有好处
⑦ c语言 链表
n是结构体num的一个实例(一个对象),对应的a b c 分别为1 3 5.0 pn是一个指向n的指针,
pn->b相当于n.b 即为3
n.a 的值为1
++pn->b 也就是 把n.b看做一个整体,一个变量,那么++n.b就是先使变量值自增1在参与运算,那就是4参与运算
表达式就是3/1*4=12
*pn 也就是n
(*pn).a+pn->f就是n.a+n.f 即1+5.0=6.0
⑧ 请教C语言高手为小弟解答的疑惑
1,int* pN=&N;
pN是一个指针,这个指针指向N,指针的值是存放数据N的内存的首地址;
2,int* pN=N;
pN也是一个指针,指针的值是就是N;
这种用法是不合适的,因为你一般不知道这个指针指向的内存内容是什么。如果真要用的话,可以写成这样:int* pN=(int*)N。
3,int* pIndex=nArray;
这种写法很正常,表示pIndex指向nArray所指的那个数组首地址。
4,int* pIndex=&nArray;
如果这么写的话,逻辑上是错的,&nArray表示一个二级指针,而pIndex是一个一级指针。
⑨ C语言求100以内素数的问题
#include<stdio.h>
int main()
{
int i=0;
int count=0;
for(i=0;i<=100;i++)
{
int j=0;
for(j=2;j<=i;j++)
{
if(i%j==0)
{
break;
}
}
if(i==j)
{
count++;
printf("%d ",i);
}
}
printf(" count=%d ",count);
return 0;
}
解题思路:
素数,就是除了1和他本身,不能被其他数整除的数字。答案就是用100到200之间的每个数字,除以2到其本身前面的那一个数字,如果此过程中出现整除的现象,则该数不是素数。如果没有整除的现象,则该数为素数输出。
(9)c语言pn扩展阅读:
质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。
质数的个数是无穷的。欧几里得的《几何原本》中有一个经典的证明。它使用了证明常用的方法:反证法。具体证明如下:假设质数只有有限的n个,从小到大依次排列为p1,p2,……,pn,设N=p1×p2×……×pn,那么,要大于p1,p2,……,pn,所以它不在那些假设的素数集合中。