『壹』 (1)(2)兩道編程題怎麼做,求大神解答。
代碼如下:
#include<stdlib.h>
#include<stdio.h>
boolnotSmall(inta,intb){
returna>=b;
}
boolnotBig(inta,intb){
returna<=b;
}
typedefbool(*Compare)(int,int);
intmain()
{
printf("inputanumber:");
charsNum[256]="";
scanf("%s",sNum);
for(size_ti=0;i<strlen(sNum);i++)
{
if((sNum[i]==' ')||(sNum[i]=='r'))break;
if(unsigned(sNum[i]-'0')>9){
printf(" errornumcharacter! ");
return-1;
}
}
intarray1[11]={0,1,2,3,4,5,6,7,8,9};
//既然是有序的,直接插入就好了
Comparecmp;
if(array1[0]>array1[1]){//降序排列
cmp=notBig;
}else{//升序
cmp=notSmall;
}
intn=atoi(sNum);
//轉化為整數輸出第一題
printf("numberis%d! ",n);
inttmp;
//第二題
for(inti=0;i<sizeof(array1)-1;i++)
{
if(cmp(n,array1[i]))continue;
for(intj=i;j<sizeof(array1)-1;j++)
{//插入
tmp=array1[i];
array1[i]=n;
n=tmp;
}
break;
}
return0;
}
『貳』 C語言編程題,求大神解答!!!!
按照題目要求用二分法求方程的實根的C語言程序如下
#include <stdio.h>
#include <math.h>
double f(double x) {return 2*x*x*x - 4*x*x + x - 2;}
int main(){
double root, x1 = 0, x2 = 10,y;
root = x1+(x2-x1)/2;
y = f(root);
while(fabs(y) > 1e-6) {
if(y > 0) x2 = root;
else x1 = root;
root = x1+(x2 - x1)/2;
y = f(root);
}
printf("%.2f ",root);
return 0;
}
『叄』 這個編程題怎麼做 謝謝解答
因為限制了只有三個數字,所以我的思路為:列出所有組合情況,冒泡排序後找到最大值即可。
我使用的是java:
public class T {
public static void main(String[] args) {
int A = 13;
int B = 312;
int C = 343;
//求出所有組合結果,根據排列組合,結果應有以下6種:
//ABC、ACB、BAC、BCA、CAB、CBA
//怕你用的不是java,這里採用通用一些的方法來獲得結果集
int[] results = new int[6];
results[0] = getResult(A, B, C);
results[1] = getResult(A, C, B);
results[2] = getResult(B, A, C);
results[3] = getResult(B, C, A);
results[4] = getResult(C, A, B);
results[5] = getResult(C, B, A);
System.out.println("所有組合結果為:");
for (int result : results) {
System.out.println(result);
}
//使用冒泡排序獲取最大值
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5 - i; j++) {
if (results[j] > results[j++]) {
int temp = results[j];
results[j] = results[j + 1];
results[j + 1] = temp;
}
}
}
System.out.println("========");
System.out.println("冒泡排序結果為:");
for (int result : results) {
System.out.println(result);
}
System.out.println("========");
System.out.println("所以這些組合中數字最大的為:[" + results[5] + "]");
}
//計算每種組合的結果,計算規則為:
//1、先將y和z組合起來,如果z有n位,組合結果為 yz = y*10的n次方 + z
//2、再將x和yz組合起來,如果yz有n位,組合結果為 xyz = yz*10的n次方 + yz
private static int getResult(int x, int y, int z) {
int yz = (int) (y * Math.pow(10, countNumber(z))) + z;
int xyz = (int) (x * Math.pow(10, countNumber(yz))) + yz;
return xyz;
}
//數一下n有多少位
private static int countNumber(int n) {
int count = 0;
while (n != 0) {
n /= 10;
count++;
}
return count;
}
}
後續還能優化的地方就在於三個數字的排列組合部分,現在用比較傻的寫死的方式,未來如果加到4個數字或者其他那就得改代碼了
代碼就是會擠到一起,我截圖給你看下:
『肆』 這個編程題怎麼寫,謝謝解答
C語言代碼和運行結果如下:
注意C語言中n/2默認下取整,結果為小於等於n/2的最大整數
而題目所求為小於n/2的所有偶數,所以要對n/2進行上取整,即寫為(n+1)/2
可見輸出結果與樣例相符,望採納~
附源碼:
#include <stdio.h>
int main() {
int n, i, sum = 0;
scanf("%d", &n);
for (i = 0; i < n; i += 2) {
printf("%d ", i);
if (i < (n + 1) / 2)
sum += i;
}
printf("偶數之和為:%d ", sum);
return 0;
}
『伍』 C語言編程題,求助大佬解答
按照題目要求編寫的求最大值和最小值及它們的位置的C語言程序如下
#include<stdio.h>
int max(int a[],int n,int *p){
int i=0,m=a[0];
*p=i;
for(i=1;i<n;i++){
if(m<a[i]){
m=a[i];
*p=i;
}
}
return m;
}
int min(int a[],int n,int *p){
int i=0,m=a[0];
*p=i;
for(i=1;i<n;i++){
if(m>a[i]){
m=a[i];
*p=i;
}
}
return m;
}
int main(){
int m,n,t=0,*p=&t,a[10]={31,28,73,83,27,56,12,43,34,63};
m=max(a,10,p);
printf("最大值為%d,位置為%d ",m,*p);
n=min(a,10,p);
printf("最小值為%d,位置為%d ",n,*p);
return 0;
}
『陸』 這個c語言編程題如何求解
如果非要用兩個函數,則:
sum1函數可以用等差數列求和公式降低時間復雜度
時間復雜度O(n)
其實sum2本身就有求和公式:
1+(1+2)+...+(1+2+...+n)=n(n+1)(n+2)÷6
時間復雜度O(1)
詳見代碼
#include<bits/stdc++.h>
#include<chrono>
#define int unsigned long long
using namespace std;
using namespace chrono;
int n;
//法1(O(n^2))
int sum11(int k){
int s=0;
for(int i=1;i<=k;i++) s+=i;
return s;
}
int sum12(int n){
int s2=0;
for(int i=1;i<=n;i++) s2+=sum11(i);
return s2;
}
//法2(O(n))
int sum21(int k){
return (1+k)*k/2;
}
int sum22(int n){
int s2=0;
for(int i=1;i<=n;i++) s2+=sum21(i);
return s2;
}
//法3
int sum32(int n){
return n*(n+1)*(n+2)/6;
}
signed main(){
cin>>n;
auto start1=system_clock::now();
cout<<"法1:"<<sum12(n);
auto end1=system_clock::now();
auto ration1=ration_cast<microseconds>(end1-start1);
cout<<" 用時"<<double(ration1.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
auto start2=system_clock::now();
cout<<"法2:"<<sum22(n);
auto end2=system_clock::now();
auto ration2=ration_cast<microseconds>(end2-start2);
cout<<" 用時"<<double(ration2.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
auto start3=system_clock::now();
cout<<"法3:"<<sum32(n);
auto end3=system_clock::now();
auto ration3=ration_cast<microseconds>(end3-start3);
cout<<" 用時"<<double(ration3.count())*microseconds::period::num/microseconds::period::den<<"秒"<<endl;
return 0;
}
運行結果:
80000
法1:85336533360000 用時6.85699秒
法2:85336533360000 用時0秒
法3:85336533360000 用時0秒
------
望您採納,謝謝
『柒』 c++編程題,求大神解答。
基本思想是計算相鄰的機器人每輪發生碰撞的時間,從小到大排列後依次發生碰撞
剩下的機器人相鄰關系會改變,重新計算碰撞時間,重復上述步驟,直到沒有碰撞發生
C++代碼如下:
#include <bits/stdc++.h> // C++萬能頭文件
using namespace std;
using tri = tuple<double, int, int>; // 發生碰撞的時間和機器人編號
int main() {
int n, k;
cin >> n;
k = n; // 剩下機器人個數
int x[n + 1], v[n + 1]; // 初始位置和速度
for (int i = 1; i <= n; ++i) // 編號從1開始
cin >> x[i] >> v[i];
int crash[n + 1]; // 標記已碰撞的機器人
memset(crash, 0, sizeof(crash));
priority_queue<tri, vector<tri>, greater<tri>> pq; // 小根堆
while (k >= 2) { // 至少兩個機器人才能相撞
int i = 1;
while (i < n && crash[i]) ++i;
while (i < n) {
int j = i + 1; // 計算與右側機器人相撞時間
while (j <= n && crash[j]) ++j;
if (j > n) break;
long d = x[j] - x[i];
if (v[i] <= 0 && v[j] < v[i] // j撞上i
|| (v[i] > 0 && v[j] < v[i])) { // i撞上j
long delta_v = v[i] - v[j];
double t = d * 1.0 / delta_v;
pq.emplace(t, i, j);
}
i = j;
}
if (pq.empty()) break; // 沒有相撞的機器人
while (!pq.empty()) {
auto t = pq.top();
pq.pop();
int ii = get<1>(t), jj = get<2>(t);
if (!crash[ii] && !crash[jj]) { // 都還在才能相撞
crash[ii] = crash[jj] = 1;
k -= 2;
}
}
}
cout << k << " ";
for (int i = 1; i <= n; ++i) {
if (!crash[i])
cout << i << " ";
}
cout << " ";
return 0;
}
已通過給出的測試用例,但需要更多用例測試是否正確,望採納~
『捌』 這2編程題怎麼解
第一題:接收輸入的數number,判斷number/100<10是否成立,不成立則不滿足要求。
若成立,個位數 = number%100;
十位數 = number/10%10;
百位數 = number/100;
輸出他們即可。
『玖』 C語言有一道題該如何解答
&&稱作邏輯與,運算規則是:只要A與B其中一個為假,A && B為假。
對整數來說,C語言認為:0為假,非0為真,所以:(x==a)&&(y=b)&& 0為假。
「假」在C語言中按整數輸出就是0。
有一條很實用的編程經驗:寫&&表達式時,將最有可能為假的條件寫在最左邊,因為&&從左向右運算,即檢查條件,只要遇到某條件為假,就不會再往後繼續,因為已可以判定這個表達式結果為假。
比如:S = A && B && C && D,按上述經驗,最有可能為假的順序應為A,B,C,D。
在程序執行過程中,只要判定A為假,則S為假,根本不需要再計算B,C,D,這可能讓程序執行的更快。