C语言 算法题

Python018

C语言 算法题,第1张

#include<cstdio>

#include<iostream>

#include<string>

#include<algorithm>

#include<cstring>

using namespace std

int data[100000]

int dp[100000]

int num

bool Change(string s)

{

for(int i=0i<s.size()+1)

{

if(s[i]<='9'&&s[i]>='0')

{

int t=0

while(s[i]<='9'&&s[i]>='0')

{

t=t*10+s[i]-'0'

i++

}

data[num++]=t

}

else if(s[i]==' '||i==s.size())

{

i++

continue

}

else{

return false

}

}

return true

}

int main()

{

string s

while(getline(cin,s))

{

num=0

bool flag=Change(s)

if(!flag)

{

cout<<"ERROR"<<endl

continue

}

/* for(int i=0i<numi++)

{

cout<<data[i]<<" "

}*/

memset(dp,0,sizeof(dp))

int sum=0

for(int i=0i<numi++)

{

sum+=data[i]

}

int half=sum/2

// cout<<half<<endl

for(int i=0i<numi++)

{

for(int j=halfj>=data[i]j--)

{

dp[j]=max(dp[j],dp[j-data[i]]+data[i])

}

}

cout<<sum-dp[half]<<" "<<dp[half]<<endl

}

}

如下:

#include <stdio.h>

double fun(int n)

{

int i,j

 double s=1,k=1.0

 for(i=1i<=ni++)

 {

  j=i

  while(j>=1)

  {

   k*=j

   j--

  }

  s+=1/k

 }

 return s

}

void main()

{

  int n 

  double s

  FILE *out

  printf("\nInput n: ") 

  scanf("%d",&n)

  s=fun(n)

  printf("s=%f\n",s)

 }

一、位运算符c语言提供了六种位运算符:

&按位与

|按位或

^按位异或

~取反

<<左移

>>右移

1.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下:00001001(9的二进制补码)&00000101(5的二进制补码)00000001(1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a&255运算(255的二进制数为0000000011111111)。

main(){

inta=9,b=5,c

c=a&b

printf("a=%d\nb=%d\nc=%d\n",a,b,c)

}

2.按位或运算按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。

例如:9|5可写算式如下:00001001|00000101

00001101(十进制为13)可见9|5=13

main(){

inta=9,b=5,c

c=a|b

printf("a=%d\nb=%d\nc=%d\n",a,b,c)

}

3.按位异或运算按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^0000010100001100(十进制为12)

main(){

inta=9

a=a^15

printf("a=%d\n",a)

}

4.求反运算求反运算符~为单目运算符,具有右结合性。其功能是对参与运算的数的各二进位按位求反。例如~9的运算为:~(0000000000001001)结果为:1111111111110110

5.左移运算左移运算符“<<”是双目运算符。其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,

高位丢弃,低位补0。例如:a<<4指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6.右移运算右移运算符“>>”是双目运算符。其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。

例如:设a=15,a>>2表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。turboc和很多系统规定为补1。

main(){

unsigneda,b

printf("inputanumber:")

scanf("%d",&a)

b=a>>5

b=b&15

printf("a=%d\tb=%d\n",a,b)

}

请再看一例!

main(){

chara='a',b='b'

intp,c,d

p=a

p=(p<<8)|b

d=p&0xff

c=(p&0xff00)>>8

printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d)

}